XML は現在、プラットフォームに依存せず、言語に依存せず、システムに依存しない普遍的なデータ交換形式となっており、データの統合と対話に大きな利便性をもたらしています。 XML 自体の文法知識と技術的な詳細については、DOM (Document Object Model)、DTD (Document Type Definition)、SAX (Simple API for XML)、XSD (Xml Schema Definition) などの関連技術文献を読む必要があります。 、XSLT (Extensible Stylesheet Language Transformations) の詳細については、w3c 公式 Web サイトのドキュメント http://www.w3.org を参照してください。
XML はさまざまな言語で同じ方法で解析されますが、実装される構文は異なります。基本的な解析方法は 2 つあり、1 つは SAX と呼ばれ、もう 1 つは DOM と呼ばれます。 SAX はイベント ストリームの解析に基づいており、DOM は XML ドキュメントのツリー構造の解析に基づいています。 XML の内容と構造が次のとおりであると仮定します。
次のようにコードをコピーします。
<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<従業員>
<従業員>
<name>ddviplinux</name>
<セックス>男</セックス>
<年齢>30</年齢>
</従業員>
</従業員>
この記事では、JAVA 言語を使用して XML ドキュメントの生成と DOM および SAX の解析を実装します。
まず、XML ドキュメントを操作するためのインターフェイスである XmlDocument を定義します。これは、XML ドキュメントを作成および解析するためのインターフェイスを定義します。
次のようにコードをコピーします。
パッケージ com.alisoft.facepay.framework.bean;
/**
*
* @著者hongliang.dinghl
* XML ドキュメントを作成および解析するためのインターフェイスを定義します
*/
パブリック インターフェイス XmlDocument {
/**
* XMLドキュメントの作成
* @param fileName ファイルのフルパス名
*/
public void createXml(String fileName);
/**
* XMLドキュメントを解析する
* @param fileName ファイルのフルパス名
*/
public void parserXml(String fileName);
}
1.DOM は XML ドキュメントを生成および解析します
XML ドキュメントの解析されたバージョンに対して一連のインターフェイスが定義されます。パーサーはドキュメント全体を読み取り、コードが DOM インターフェイスを使用して操作できるメモリ常駐ツリー構造を構築します。利点: ドキュメント ツリー全体がメモリ内にあるため、操作が簡単です。削除、変更、再配置などの複数の機能をサポートしています。欠点: ドキュメント全体をメモリに転送すると (無駄なノードを含む)、時間とスペースが無駄になります。このデータに複数回アクセスする必要がある場合でも、ハードウェア リソース (メモリ、CPU) は十分です。
次のようにコードをコピーします。
パッケージ com.alisoft.facepay.framework.bean;
java.io.FileInputStreamをインポートします。
インポートjava.io.FileNotFoundException;
java.io.FileOutputStreamをインポートします。
インポート java.io.IOException;
java.io.InputStreamをインポートします。
java.io.PrintWriterをインポートします。
インポート javax.xml.parsers.DocumentBuilder;
インポート javax.xml.parsers.DocumentBuilderFactory;
インポート javax.xml.parsers.ParserConfigurationException;
javax.xml.transform.OutputKeysをインポートします。
インポート javax.xml.transform.Transformer;
インポート javax.xml.transform.TransformerConfigurationException;
インポート javax.xml.transform.TransformerException;
インポート javax.xml.transform.TransformerFactory;
インポート javax.xml.transform.dom.DOMSource;
インポートjavax.xml.transform.stream.StreamResult;
org.w3c.dom.Document をインポートします。
org.w3c.dom.Element をインポートします。
org.w3c.dom.Node をインポートします。
org.w3c.dom.NodeList をインポートします。
org.xml.sax.SAXException をインポートします。
/**
*
* @著者hongliang.dinghl
* DOM の生成と XML ドキュメントの解析
*/
パブリック クラス DomDemo は XmlDocument を実装します {
private Document ドキュメント。
プライベート文字列ファイル名;
public void init() {
試す {
DocumentBuilderFactory ファクトリ = DocumentBuilderFactory
.newInstance();
DocumentBuilder ビルダー = Factory.newDocumentBuilder();
this.document = builder.newDocument();
} catch (ParserConfigurationException e) {
System.out.println(e.getMessage());
}
}
public void createXml(String fileName) {
要素ルート = this.document.createElement("従業員");
this.document.appendChild(root);
要素従業員 = this.document.createElement("従業員");
要素名 = this.document.createElement("name");
name.appendChild(this.document.createTextNode("丁宏良"));
従業員.appendChild(名前);
要素の性別 = this.document.createElement("sex");
sex.appendChild(this.document.createTextNode("m"));
従業員.appendChild(性別);
要素の年齢 = this.document.createElement("年齢");
age.appendChild(this.document.createTextNode("30"));
従業員.appendChild(年齢);
root.appendChild(従業員);
TransformerFactory tf = TransformerFactory.newInstance();
試す {
トランスフォーマー トランスフォーマー = tf.newTransformer();
DOMSource ソース = 新しい DOMSource(ドキュメント);
transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperty(OutputKeys.INDENT, "はい");
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
StreamResult 結果 = 新しい StreamResult(pw);
トランスフォーマー.transform(ソース, 結果);
System.out.println("XML ファイルが正常に生成されました!");
} catch (TransformerConfigurationException e) {
System.out.println(e.getMessage());
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (TransformerException e) {
System.out.println(e.getMessage());
}
}
public void parserXml(String fileName) {
試す {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
ドキュメント document = db.parse(fileName);
NodeList 従業員 = document.getChildNodes();
for (int i = 0; i < 従業員.getLength(); i++) {
ノード従業員 = 従業員.item(i);
NodeList 従業員情報 = 従業員.getChildNodes();
for (int j = 0; j < 従業員情報.getLength(); j++) {
ノードノード = 従業員情報.項目(j);
NodeList 従業員メタ = node.getChildNodes();
for (int k = 0; k <従業員Meta.getLength(); k++) {
System.out.println(employeeMeta.item(k).getNodeName()
+ ":" +従業員メタ.アイテム(k).getTextContent());
}
}
}
System.out.println("解析が完了しました");
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (ParserConfigurationException e) {
System.out.println(e.getMessage());
} キャッチ (SAXException e) {
System.out.println(e.getMessage());
} キャッチ (IOException e) {
System.out.println(e.getMessage());
}
}
}
2.SAX は XML ドキュメントを生成および解析します
DOM の問題を解決するために SAX が登場しました。 SAX、イベント駆動型。パーサーは、要素の先頭、要素の末尾、テキスト、ドキュメントなどの先頭または末尾を見つけると、イベントを送信し、プログラマーはこれらのイベントに応答してデータを保存するコードを作成します。利点: ドキュメント全体を事前にロードする必要がなく、使用するリソースが少なくなります。SAX パーサー コードは DOM パーサー コードより小さく、アプレットやダウンロードに適しています。欠点: 永続的ではない; イベント後、データが保存されない場合、データは失われます。ただし、テキストがどの要素に属しているかは不明です。 XML ドキュメント コンテンツの量が少なく、再利用されることはほとんどありません。
Javaコード
次のようにコードをコピーします。
パッケージ com.alisoft.facepay.framework.bean;
java.io.FileInputStreamをインポートします。
インポートjava.io.FileNotFoundException;
インポート java.io.IOException;
java.io.InputStreamをインポートします。
インポート javax.xml.parsers.ParserConfigurationException;
インポート javax.xml.parsers.SAXParser;
インポート javax.xml.parsers.SAXParserFactory;
org.xml.sax.Attributes をインポートします。
org.xml.sax.SAXException をインポートします。
org.xml.sax.helpers.DefaultHandler をインポートします。
/**
*
* @著者hongliang.dinghl
* SAX ドキュメントの解析
*/
パブリック クラス SaxDemo は XmlDocument を実装します {
public void createXml(String fileName) {
System.out.println("<<"+ファイル名+">>");
}
public void parserXml(String fileName) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
試す {
SAXParser saxparser = saxfac.newSAXParser();
入力ストリームは = 新しい FileInputStream(ファイル名);
saxparser.parse(is, new MySAXHandler());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} キャッチ (SAXException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} キャッチ (IOException e) {
e.printStackTrace();
}
}
}
class MySAXHandler extends DefaultHandler {
ブール値属性 = false;
属性attributes = null;
public void startDocument() は SAXException をスローします {
System.out.println("ドキュメントの印刷が開始されました");
}
public void endDocument() は SAXException をスローします {
System.out.println("ドキュメントの印刷が終了しました");
}
public void startElement(String uri, String localName, String qName,
属性attributes) throws SAXException {
if (qName.equals("従業員")) {
戻る;
}
if (qName.equals("従業員")) {
System.out.println(qName);
}
if (attributes.getLength() > 0) {
this.attributes = 属性;
this.hasAttribute = true;
}
}
public void endElement(String uri, String localName, String qName)
SAXException をスローします {
if (hasAttribute && (attributes != null)) {
for (int i = 0; i <attributs.getLength(); i++) {
System.out.println(attributes.getQName(0)
+ 属性.getValue(0));
}
}
}
public void 文字(char[] ch, int start, int length)
SAXException をスローします {
System.out.println(new String(ch, start, length));
}
}
パッケージ com.alisoft.facepay.framework.bean;
java.io.FileInputStreamをインポートします。
インポートjava.io.FileNotFoundException;
インポート java.io.IOException;
java.io.InputStreamをインポートします。
インポート javax.xml.parsers.ParserConfigurationException;
インポート javax.xml.parsers.SAXParser;
インポート javax.xml.parsers.SAXParserFactory;
org.xml.sax.Attributes をインポートします。
org.xml.sax.SAXException をインポートします。
org.xml.sax.helpers.DefaultHandler をインポートします。
/**
*
* @著者hongliang.dinghl
* SAX ドキュメントの解析
*/
パブリック クラス SaxDemo は XmlDocument を実装します {
public void createXml(String fileName) {
System.out.println("<<"+ファイル名+">>");
}
public void parserXml(String fileName) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
試す {
SAXParser saxparser = saxfac.newSAXParser();
入力ストリームは = 新しい FileInputStream(ファイル名);
saxparser.parse(is, new MySAXHandler());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} キャッチ (SAXException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} キャッチ (IOException e) {
e.printStackTrace();
}
}
}
class MySAXHandler extends DefaultHandler {
ブール値属性 = false;
属性attributes = null;
public void startDocument() は SAXException をスローします {
System.out.println("ドキュメントの印刷が開始されました");
}
public void endDocument() は SAXException をスローします {
System.out.println("ドキュメントの印刷が終了しました");
}
public void startElement(String uri, String localName, String qName,
属性attributes) throws SAXException {
if (qName.equals("従業員")) {
戻る;
}
if (qName.equals("従業員")) {
System.out.println(qName);
}
if (attributes.getLength() > 0) {
this.attributes = 属性;
this.hasAttribute = true;
}
}
public void endElement(String uri, String localName, String qName)
SAXException をスローします {
if (hasAttribute && (attributes != null)) {
for (int i = 0; i <attributs.getLength(); i++) {
System.out.println(attributes.getQName(0)
+ 属性.getValue(0));
}
}
}
public void 文字(char[] ch, int start, int length)
SAXException をスローします {
System.out.println(new String(ch, start, length));
}
}
3.DOM4J は XML ドキュメントを生成および解析します
DOM4J は、優れたパフォーマンス、強力な機能、そして非常に使いやすい、非常に優れた Java XML API です。また、オープンソース ソフトウェアでもあります。最近では、XML の読み書きに DOM4J を使用する Java ソフトウェアが増えています。特に、Sun の JAXM も DOM4J を使用していることは注目に値します。
Javaコード
次のようにコードをコピーします。
パッケージ com.alisoft.facepay.framework.bean;
java.io.ファイルをインポートします。
java.io.FileWriterをインポートします。
インポート java.io.IOException;
java.io.Writerをインポートします。
java.util.Iteratorをインポートします。
org.dom4j.Document をインポートします。
org.dom4j.DocumentException をインポートします。
org.dom4j.DocumentHelper をインポートします。
org.dom4j.Element をインポートします。
org.dom4j.io.SAXReader をインポートします。
org.dom4j.io.XMLWriter をインポートします。
/**
*
* @著者hongliang.dinghl
* Dom4j は XML ドキュメントを生成し、XML ドキュメントを解析します
*/
パブリック クラス Dom4jDemo は XmlDocument を実装します {
public void createXml(String fileName) {
ドキュメントドキュメント = DocumentHelper.createDocument();
要素従業員=document.addElement("従業員");
要素従業員=従業員.addElement("従業員");
要素名=従業員.addElement("名前");
name.setText("ddvip");
要素の性別=従業員.addElement("性別");
sex.setText("m");
要素の年齢=従業員.addElement("年齢");
年齢.setText("29");
試す {
ライター fileWriter=新しい FileWriter(ファイル名);
XMLWriter xmlWriter=新しい XMLWriter(fileWriter);
xmlWriter.write(ドキュメント);
xmlWriter.close();
} キャッチ (IOException e) {
System.out.println(e.getMessage());
}
}
public void parserXml(String fileName) {
ファイル inputXml=新しいファイル(ファイル名);
SAXReader saxReader = new SAXReader();
試す {
ドキュメント document = saxReader.read(inputXml);
要素従業員=document.getRootElement();
for(Iterator i = 従業員.elementIterator(); i.hasNext();){
要素従業員 = (要素) i.next();
for(Iterator j = 従業員.elementIterator(); j.hasNext();){
要素ノード=(要素) j.next();
System.out.println(node.getName()+":"+node.getText());
}
}
} catch (DocumentException e) {
System.out.println(e.getMessage());
}
System.out.println("dom4j parserXml");
}
}
4.JDOM は XML を生成および解析します
DOM と SAX のコーディング量を削減するために、JDOM には 20-80 原則によりコード量が大幅に削減されるという利点が現れました。利用シーン: 実装する機能は解析、作成など単純なものですが、JDOM の最下位レベルでは依然として SAX (最も一般的に使用されている)、DOM、および Xanan ドキュメントが使用されます。
次のようにコードをコピーします。
パッケージ com.alisoft.facepay.framework.bean;
インポートjava.io.FileNotFoundException;
java.io.FileOutputStreamをインポートします。
インポート java.io.IOException;
java.util.Listをインポートします。
org.jdom.Document をインポートします。
org.jdom.Element をインポートします。
org.jdom.JDOMException をインポートします。
org.jdom.input.SAXBuilder をインポートします。
org.jdom.output.XMLOutputter をインポートします。
/**
*
* @著者hongliang.dinghl
* JDOM は XML ドキュメントを生成および解析します
*
*/
パブリック クラス JDomDemo は XmlDocument を実装します {
public void createXml(String fileName) {
文書文書。
要素ルート。
root=new Element("従業員");
document=新しいドキュメント(ルート);
要素従業員=新しい要素("従業員");
root.addContent(従業員);
要素名=新しい要素("名前");
name.setText("ddvip");
従業員.addContent(名前);
要素の性別=新しい要素("性別");
sex.setText("m");
従業員.addContent(性別);
要素年齢=新しい要素("年齢");
年齢.setText("23");
従業員.addContent(年齢);
XMLOutputter XMLOut = new XMLOutputter();
試す {
XMLOut.output(document, new FileOutputStream(fileName));
} catch (FileNotFoundException e) {
e.printStackTrace();
} キャッチ (IOException e) {
e.printStackTrace();
}
}
public void parserXml(String fileName) {
SAXBuilder ビルダー=新しい SAXBuilder(false);
試す {
ドキュメント document=builder.build(fileName);
要素従業員=document.getRootElement();
リスト従業員List=employees.getChildren("従業員");
for(int i=0;iElement 従業員=(Element)employeeList.get(i);
リスト従業員情報=従業員.getChildren();
for(int j=0;jSystem.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());
}
}
} キャッチ (JDOMException e) {
e.printStackTrace();
} キャッチ (IOException e) {
e.printStackTrace();
}
}
}