目次
HTMLとXMLの違い
1. XMLでは大文字と小文字が区別されますが、HTMLでは区別されません。
2. HTMLで、段落またはリストキーの終わりがコンテキストに明確に示されている場合は、</ p>や</ li>などの終了タグを省略できます。XMLでは、終了タグを省略してはなりません。
HTML:<img src = "1.jpg"> <br> <br>
XML:<img src = "1.jpg"> </ img> <br/> <br/>
3. XMLでは、単一のタグがあり、一致する終了タグがない要素は、/文字で終了する必要があります。このようにして、アナライザーは終了タグを探す必要がないことを認識します。
4. XMLでは、属性値は引用符で囲む必要があります。HTMLでは、引用符を使用できるかどうか。
5. HTMLでは、値なしで属性名を持つことができます。XMLでは、すべての属性に対応する値が必要です。
- XMLはデータの保存と送信に使用されます
- HTMLはデータの表示に使用されます
- XML構文要件に完全に準拠するHTMLを使用する場合、それはXHTML標準への準拠と呼ばれます。XHTML標準に準拠するページはSEOに適しています。
XMLを解析する
-
DOM分析
DOM(ドキュメントオブジェクトモデル)、
DOMは、プラットフォームや言語に依存しない方法でXMLドキュメントを表現するための公式のW3C標準です。DOMは、階層構造で編成されたノードまたは情報の集合です。この階層構造により、開発者はツリー内の特定の情報を見つけることができます。この構造を分析するには、通常、ドキュメント全体をロードし、作業を行う前に階層を構築する必要があります。DOMは情報階層に基づいているため、ツリーベースまたはオブジェクトベースと見なされます。
【メリット】
①アプリケーションがデータや構造を変更できるようにします。
②アクセスは双方向で、いつでもツリー内を上下に移動して、データの任意の部分を取得および操作できます。
【デメリット】
①通常、XMLドキュメント全体を読み込んで階層構造を構築する必要があり、多くのリソースを消費します。
-
SAX分析
SAX(XML用のシンプルなAPI)
SAX処理の利点は、ストリーミングメディアの利点と非常によく似ています。すべてのデータが処理されるのを待たずに、分析をすぐに開始できます。さらに、アプリケーションはデータが読み取られたときにのみデータをチェックするため、データをメモリに保存する必要はありません。これは、大きなドキュメントにとって大きな利点です。実際、アプリケーションはドキュメント全体を解析する必要はありません。特定の条件が満たされると、解析を停止できます。一般的に、SAXは代替のDOMよりもはるかに高速です。
【メリット】
①すべてのデータが処理されるのを待つ必要がなく、すぐに分析を開始できます。
②読み取り時のみデータを確認し、メモリに保存する必要はありません。
③特定の条件が満たされると、ドキュメント全体を解析せずに解析を停止できます。
④システムメモリよりも大きいドキュメントを解析できる、高効率と高パフォーマンス。
【デメリット】
①TAGの処理ロジック(親子関係の維持など)をアプリケーションが担当する必要があります。ドキュメントが複雑になるほど、プログラムも複雑になります。
②一方向のナビゲーションで、ドキュメントレベルを見つけることができず、同じドキュメントの異なる部分に同時にアクセスすることが困難です。XPathはサポートされていません。
DOMまたはSAXを選択しますか?
- XMLドキュメントを処理するために独自のコードを作成する必要がある開発者にとって、DOMまたはSAX解析モデルを選択することは非常に重要な設計上の決定です。DOMはツリー構造を使用してXMLドキュメントにアクセスしますが、SAXはイベントモデルを使用します。
- DOMパーサーは、XMLドキュメントをそのコンテンツを含むツリーに変換し、ツリーをトラバースできます。DOM解析モデルを使用する利点は、プログラミングが簡単なことです。開発者は、命令を呼び出してツリーを構築し、ナビゲーションAPIを使用して必要なツリーノードにアクセスするだけでタスクを完了できます。ツリー内の要素を簡単に追加および変更できます。ただし、DOMパーサーを使用する場合はXMLドキュメント全体を処理する必要があるため、特に大きなXMLファイルに遭遇した場合は、パフォーマンスとメモリの要件が比較的高くなります。DOMパーサーは、そのトラバーサル機能により、XMLドキュメントを頻繁に変更する必要があるサービスでよく使用されます。
- SAXパーサーはイベントベースのモデルを使用します。XMLドキュメントを解析するときに一連のイベントをトリガーできます。特定のタグが見つかると、コールバックメソッドをアクティブにして、メソッドで指定されたタグが見つかったことを通知できます。SAXのメモリ要件は通常、比較的低くなります。これは、開発者が処理するタグを決定できるためです。特に、開発者がドキュメントに含まれるデータの一部のみを処理する必要がある場合、SAXの拡張機能がより適切に反映されます。ただし、SAXパーサーを使用する場合、コーディングはより困難であり、同じドキュメント内の複数の異なるデータに同時にアクセスすることは困難です。
-
DOM4J分析
DOM4J(Java用ドキュメントオブジェクトモデル)
【メリット】
①Javaコレクションクラスを大量に使用しているため、Java開発者にとって便利であり、パフォーマンスを向上させるための代替方法がいくつかあります。
②XPathをサポートします。
③性能は良いです。
【デメリット】
①大:インターフェースの使用量が多く、APIが複雑です。
DOM4Jは完全に独立した開発結果を表していますが、当初はJDOMのインテリジェントなブランチでした。統合されたXPathサポート、XMLスキーマのサポート、大きなドキュメントやストリーミングドキュメントのイベントベースの処理など、基本的なXMLドキュメント表現以外の多くの機能が組み込まれています。また、ドキュメント表現を構築するオプションも提供し、DOM4JAPIと標準のDOMインターフェイスを介した並列アクセス機能を備えています。
2000年後半から開発中です。これらすべての機能をサポートするために、DOM4Jはインターフェースと抽象基本クラスメソッドを使用します。DOM4Jは、APIのCollectionsクラスを広範囲に使用しますが、多くの場合、パフォーマンスを向上させるための代替メソッドや、より直接的なコーディングメソッドも提供します。直接的な利点は、DOM4Jはより複雑なAPIの代償を払っていますが、JDOMよりもはるかに高い柔軟性を提供することです。
柔軟性、XPath統合、および大規模なドキュメント処理の目標を追加する場合、DOM4Jの目標はJDOMと同じです。つまり、Java開発者にとって使いやすさと直感的な操作です。また、JDOMよりも完全なソリューションになることを約束し、本質的にすべてのJava / XMLの問題に対処するという目標を達成します。この目標を達成する上で、JDOMよりも誤ったアプリケーションの動作を防ぐことに重点を置いていません。
DOM4Jは、非常に優れたJava XML APIであり、優れたパフォーマンス、強力な機能、非常に使いやすい特性を備えており、オープンソースソフトウェアでもあります。最近では、XMLの読み取りと書き込みにDOM4Jを使用するJavaソフトウェアが増えていることがわかります。SunのJAXMでもDOM4Jを使用していることは特に言及する価値があります。
-
JDOM分析
JDOM(Javaベースのドキュメントオブジェクトモデル)
[利点]
①インターフェースの代わりに具象クラスを使用して、DOMAPIを簡素化します。
②Javaコレクションクラスを多数使用しているため、Java開発者にとって便利です。
【デメリット】
①これ以上の柔軟性はありません。
②パフォーマンスが悪い。
JDOMの目的は、Java固有のドキュメントモデルになることです。これにより、XMLとの対話が簡素化され、DOMを使用するよりも高速になります。これは最初のJava固有のモデルであるため、JDOMは積極的に宣伝されています。「Java仕様要求JSR-102」を通じて、最終的に「Java標準拡張」として使用することを検討しています。JDOMの開発は2000年の初めから開始されてい
ます。JDOMとDOMは主に2つの点で異なります。まず、JDOMのみインターフェース。これにより、APIがいくつかの点で簡素化されますが、柔軟性も制限されます。次に、APIはCollectionsクラスを広範囲に使用し、これらのクラスに既に精通しているJava開発者の使用を簡素化します。 。JDOMドキュメントには、その目的は「20%(またはそれ以下)の労力を使用して80%(またはそれ以上)のJava / XML問題を解決する」ことであると記載されています(学習曲線に基づいて20%と想定)。JDOMは確かに次の場合に役立ちます。ほとんどのJava / XMLアプリケーション、およびほとんどの開発者は、APIがDOMよりもはるかに理解しやすいと感じています。JDOMには、ユーザーがXMLで無意味なことをしないように、プログラムの動作に関する非常に広範なチェックも含まれています。ただし、それでも完全に理解する必要があります。基本を超えた何かを行うためのXML。作業(または場合によってはエラーを理解する)。これは、DOMまたは
JDOMインターフェースを学習するよりも意味のある作業である可能性があります
。JDOM自体にはパーサーが含まれていません。通常、SAX2パーサーを使用して解析します。入力XMLドキュメントを検証します(ただし、以前に作成したDOM表現を入力として受け取ることもできます)。これには、JDOM表現をSAX2イベントストリーム、DOMモデル、またはXMLテキストドキュメントとして出力するためのコンバーターが含まれています。 Apacheライセンス。ソースコード。
package xml;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 解析 XML
* XML 解析有两种方式:SAX ,DOM
* SAX:simple api for xml ,解析XML的简单API,特点是内存占用少,速度快,
* 但是由于逐行扫描形式解析,对整体结构没有把控,不能修改XML内容
*
* DOM:document object model, 文档对象模型。特点是解析XML时会将
* XML结构内建成一颗树然后通过遍历树的形式解析xml内容,由于对
* 整体结构有把控,可以修改XML内容。但是由于会内建整棵树,因此内存占用多,
* 速度慢。
* W3C推荐的解析形式为DOM|
*
* DOM4J dom for java
*
* o2o to
* p2p p to p
*/
public class ParseXmlDemo {
public static void main(String[] args) {
/*
*使用dom 解析XML 的大致步骤
*1:创建SAXReader
*2:使用SAXReader 读取到XML 文档并生成Document对象(内建树过程)
*3:通过Document 对象获取根元素
*4:通过根元素开始按照XML的结构逐级获取子元素以达到遍历XML的目的
*/
try {
//1
SAXReader reader= new SAXReader();
//2
Document doc =reader.read(new File("./emplist.xml"));
/*
* 3: 获取根标签
* Element 类的每一个实例用于表示XML文档中的一个元素(
* 一对标签)通过Element 可以获取其表示的这对标签的相关信息
* 常用操作有:
* String getName()
* 获取当前标签名字
*
* String getText()
* 获取当前标签中间的文本
*
* Element element(String name)
* 获取当前标签下指定名字的字标签
*
* List elements()
* 获取当前标签下所有字标签
*
* List elements(String name)
* 获取当前标签下所有同名字标签(指定的名字)
*
*/
//<list>标签
Element root = doc.getRootElement();
System.out.println(root.getName());//输出跟标签名字
/*
*将emplist.xml文件中所有的员工信息读取出来并存入一个集合
*/
List<Emp> empList = new ArrayList<>();
//从<list>标签下获取所有<emp>标签
List<Element> list=root.elements("emp");
System.out.println(list.size());
//遍历每一个<emp>标签
for(Element empEle: list){
//获取该员工的名字
//1先获取<emp>标签下名为<name>的子标签
Element nameEle = empEle.element("name");
String name = nameEle.getTextTrim();
//获取年龄
int age = Integer.parseInt(
empEle.elementText("age")
);
//获取性别
String gender = empEle.elementText("gender");
//获取工资
int salary = Integer.parseInt(
empEle.elementText("salary")
);
//attributeValue方法用来获取当前标签下指定名字的属性对应的值
//获取<emp>标签中的属性
int id = Integer.parseInt(
empEle.attributeValue("id")
);
Emp emp = new Emp(id, name, age, gender, salary);
empList.add(emp);
}
System.out.println("解析完成!");
for(Emp e:empList){
System.out.println(e);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}