1. 基本的な知識:
一般に、Java が XML を解析するには、DOM、SAX、JDOM、および DOM4J の 4 つの方法があります。
2. 使い方の紹介
1)、DOM
(1)はじめに
W3C によって提供されるインターフェイス (org.w3c.dom) は、XML ドキュメント全体をメモリに読み取り、各ノードで動作する DOM ツリーを構築します。利点は、ドキュメント全体が常にメモリ内にあり、いつでもどのノードにもアクセスできることです。また、ツリー トラバーサルは比較的馴染みのある操作でもあるため、メモリを消費し、すべてのドキュメントがメモリに読み込まれるまで待たなければならないことが欠点です。加工前。
(2) サンプルコード:
次のようにコードをコピーします。
<?xml version="1.0" encoding="UTF-8" スタンドアロン="no"?>
<ルート>
<電話>
<type name="ノキア">
<価格>599</価格>
<オペレータ>CMCC</オペレータ>
</type>
<type name="xiaomi">
<価格>699</価格>
<オペレーター>チャイナネット</オペレーター>
</type>
</電話>
</root>
次のようにコードをコピーします。
インポートjava.io.ByteArrayOutputStream;
java.io.ファイルをインポートします。
java.io.FileOutputStreamをインポートします。
インポート java.io.IOException;
java.io.StringReaderをインポートします。
インポート javax.xml.parsers.DocumentBuilder;
インポート javax.xml.parsers.DocumentBuilderFactory;
インポート javax.xml.parsers.ParserConfigurationException;
インポート 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.InputSource をインポートします。
org.xml.sax.SAXException をインポートします。
パブリック クラス XMLHandler {
public XMLHandler(){
}
public String createXML(){
文字列 xmlStr = null;
DocumentBuilderFactory ファクトリ = DocumentBuilderFactory.newInstance();
試す {
DocumentBuilder ビルダー = Factory.newDocumentBuilder();
ドキュメント document = builder.newDocument();
document.setXmlVersion("1.0");
要素ルート = document.createElement("ルート");
document.appendChild(ルート);
要素電話 = document.createElement("TelePhone");
要素 nokia = document.createElement("type");
nokia.setAttribute("名前", "nokia");
要素の価格Nokia = document.createElement("価格");
PriceNokia.setTextContent("599");
nokia.appendChild(priceNokia);
要素演算子Nokia = document.createElement("operator");
OperatorNokia.setTextContent("CMCC");
nokia.appendChild(operatorNokia);
電話.appendChild(nokia);
要素 xiaomi = document.createElement("type");
xiaomi.setAttribute("名前", "xiaomi");
要素価格XiaoMi = document.createElement("価格");
価格XiaoMi.setTextContent("699");
xiaomi.appendChild(priceXiaoMi);
要素演算子XiaoMi = document.createElement("演算子");
OperatorXiaoMi.setTextContent("チャイナネット");
xiaomi.appendChild(operatorXiaoMi);
電話.appendChild(xiaomi);
root.appendChild(電話);
TransformerFactory transFactory = TransformerFactory.newInstance();
トランスフォーマー transFormer = transFactory.newTransformer();
DOMSource domSource = 新しい DOMSource(ドキュメント);
//文字列をエクスポートする
ByteArrayOutputStream bos = 新しい ByteArrayOutputStream();
transFormer.transform(domSource, new StreamResult(bos));
xmlStr = bos.toString();
//------
//ファイルとして保存
ファイル file = new File("TelePhone.xml");
if(!file.exists()){
file.createNewFile();
}
FileOutputStream out = 新しい FileOutputStream(ファイル);
StreamResult xmlResult = 新しい StreamResult(out);
transFormer.transform(domSource, xmlResult);
//----------
} catch (ParserConfigurationException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}catch (TransformerConfigurationException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}catch (TransformerException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
xmlStr を返します。
}
public void parserXML(String strXML){
DocumentBuilderFactory ファクトリ = DocumentBuilderFactory.newInstance();
試す {
DocumentBuilder ビルダー = Factory.newDocumentBuilder();
StringReader sr = 新しい StringReader(strXML);
入力ソースは = 新しい入力ソース(sr);
ドキュメント doc = builder.parse(is);
要素 rootElement = doc.getDocumentElement();
NodeList 電話 = rootElement.getElementsByTagName("type");
for (int i = 0; i <phones.getLength(); i++) {
ノードタイプ =phones.item(i);
String PhoneName = ((要素)タイプ).getAttribute("名前");
System.out.println("電話名 = "+電話名);
NodeList プロパティ = type.getChildNodes();
for (int j = 0; j < property.getLength(); j++) {
ノードのプロパティ = property.item(j);
文字列ノード名 = property.getNodeName();
if (nodeName.equals("価格")) {
文字列価格=property.getFirstChild().getNodeValue();
System.out.println("価格="+価格);
else if (nodeName.equals("operator")) {
文字列演算子=property.getFirstChild().getNodeValue();
System.out.println("operator="+operator);
}
}
}
} catch (ParserConfigurationException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}catch (SAXException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} キャッチ (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
public static void main(String[] args) {
XMLHandler ハンドラー = new XMLHandler();
文字列 xml = handler.createXML();
System.out.println(xml);
handler.parserXML(xml);
}
}
(3) エレメントとノードの違い(org.w3c.dom)
Node オブジェクトは、ドキュメント オブジェクト モデル全体の主要なデータ型であり、DOM 内の最も基本的なオブジェクトであり、ドキュメント ツリー内の抽象ノードを表します。ただし、実際の使用では、Node オブジェクトが直接使用されることはほとんどなく、Node オブジェクトのサブオブジェクトである Element、Attr、Text などが使用されます。
Element オブジェクトは HTML または XML ドキュメント内の要素を表し、Node クラスの主要なサブオブジェクトです。この要素には属性を含めることができるため、Element にはその属性にアクセスするためのメソッドがあります。
要素はノードから継承されます。要素は、<div>...</div> など、要素となるための完全な情報を含むノードである必要があります。ただし、ノードは必ずしも要素である必要はなく、要素はノードでなければなりません。
ノードには、要素、テキスト、属性、RootElement、コメント、名前空間などのいくつかのサブタイプがあります。
2)、SAX
3)、JDOM
4)、DOM4J
(1)はじめに
dom4j は現在、XML 解析において最高の機能を備えています (Hibernate と Sun の JAXM も XML 解析に dom4j を使用します)。これには、統合された XPath サポート、XML スキーマ サポート、大規模ドキュメントまたはストリーミング ドキュメントのイベントベースの処理など、基本的な XML ドキュメント表現を超える多くの機能が組み込まれています。
XPATH を使用する場合、jaxen.jar を追加しないと、次のエラーが発生します。
次のようにコードをコピーします。
スレッド「メイン」java.lang.NoClassDefFoundError での例外: org/jaxen/JaxenException
org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230) で
org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207) で
org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164) で
(2) サンプルコード:
次のようにコードをコピーします。
java.io.ファイルをインポートします。
java.io.FileWriterをインポートします。
インポート java.io.IOException;
java.io.StringReaderをインポートします。
インポートjava.io.StringWriter;
java.util.Listをインポートします。
org.dom4j.Document をインポートします。
org.dom4j.DocumentException をインポートします。
org.dom4j.DocumentHelper をインポートします。
org.dom4j.Element をインポートします。
org.dom4j.io.OutputFormat をインポートします。
org.dom4j.io.SAXReader をインポートします。
org.dom4j.io.XMLWriter をインポートします。
org.xml.sax.InputSource をインポートします。
パブリック クラス XMLHandler {
public XMLHandler() {
// TODO 自動生成されたコンストラクター スタブ
}
public String createXML(){
文字列 strXML = null;
ドキュメントドキュメント = DocumentHelper.createDocument();
要素ルート = document.addElement("ルート");
要素電話 = root.addElement("TelePhone");
要素 nokia =phone.addElement("type");
nokia.addAttribute("名前", "nokia");
要素の価格_nokia = nokia.addElement("価格");
価格_nokia.addText("599");
要素operator_nokia = nokia.addElement("operator");
Operator_nokia.addText("CMCC");
要素 xiaomi =phone.addElement("タイプ");
xiaomi.addAttribute("名前", "xiaomi");
要素価格_xiaomi = xiaomi.addElement("価格");
価格_xiaomi.addText("699");
要素operator_xiaomi = xiaomi.addElement("operator");
Operator_xiaomi.addText("チャイナネット");
//----------
StringWriter strWtr = 新しい StringWriter();
OutputFormat 形式 = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter xmlWriter =new XMLWriter(strWtr, format);
試す {
xmlWriter.write(ドキュメント);
キャッチ (IOException e1) {
// TODO 自動生成された catch ブロック
e1.printStackTrace();
}
strXML = strWtr.toString();
//----------
//------
//strXML=document.asXML();
//------
//---------------
ファイル file = new File("TelePhone.xml");
if (file.exists()) {
ファイル.削除();
}
試す {
file.createNewFile();
XMLWriter out = new XMLWriter(new FileWriter(file));
out.write(ドキュメント);
out.flush();
out.close();
} キャッチ (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
//---------------
strXML を返します。
}
public void parserXML(String strXML){
SAXReader リーダー = new SAXReader();
StringReader sr = 新しい StringReader(strXML);
入力ソースは = 新しい入力ソース(sr);
試す {
ドキュメント document = Reader.read(is);
要素ルート = document.getRootElement();
//要素を取得
List<Element>phoneList = root.elements("TelePhone");
List<Element> typeList =phoneList.get(0).elements("type");
for (int i=0;i<typeList.size();i++){
要素要素 = typeList.get(i);
文字列電話名 = element.attributeValue("名前");
System.out.println("電話名 = "+電話名);
//すべての要素を取得する
List<Element> childList = element.elements();
for (int j=0;j<childList.size();j++){
要素 e = childList.get(j);
System.out.println(e.getName()+"="+e.getText());
}
}
} catch (DocumentException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
public void parserXMLbyXPath(String strXML){
SAXReader リーダー = new SAXReader();
StringReader sr = 新しい StringReader(strXML);
入力ソースは = 新しい入力ソース(sr);
試す {
ドキュメント document = Reader.read(is);
リスト list = document.selectNodes("/root/TelePhone/type");
for(int i=0;i<list.size();i++){
要素 e = (要素) list.get(i);
System.out.println("phonename="+e.attributeValue("name"));
リスト list1 = e.selectNodes("./*");
for(int j=0;j<list1.size();j++){
要素 e1 = (要素) list1.get(j);
System.out.println(e1.getName()+"="+e1.getText());
}
}
} catch (DocumentException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
/**
* @param 引数
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド スタブ
XMLHandler ハンドラー = new XMLHandler();
文字列 strXML=handler.createXML();
System.out.println(strXML);
handler.parserXML(strXML);
System.out.println("----------");
handler.parserXMLbyXPath(strXML);
}
}
5)Xパス
(1)はじめに
XPath は、XML ドキュメント内の情報を検索するための言語です。 XPath は、XML ドキュメント内の要素と属性間を移動するために使用されます。
特定の構文の紹介については、http://w3school.com.cn/xpath/index.asp を参照してください。
(2) サンプルコード:
次のようにコードをコピーします。
インポート java.io.IOException;
java.io.StringReaderをインポートします。
インポート javax.xml.parsers.DocumentBuilder;
インポート javax.xml.parsers.DocumentBuilderFactory;
インポート javax.xml.parsers.ParserConfigurationException;
インポートjavax.xml.xpath.XPath;
インポート javax.xml.xpath.XPathConstants;
インポート javax.xml.xpath.XPathExpression;
インポート javax.xml.xpath.XPathExpressionException;
インポートjavax.xml.xpath.XPathFactory;
org.w3c.dom.Document をインポートします。
org.w3c.dom.Element をインポートします。
org.w3c.dom.Node をインポートします。
org.w3c.dom.NodeList をインポートします。
org.xml.sax.InputSource をインポートします。
org.xml.sax.SAXException をインポートします。
パブリック クラス XMLHandler {
public XMLHandler() {
// TODO 自動生成されたコンストラクター スタブ
}
public void parserXML(String strXML){
DocumentBuilderFactory ファクトリ = DocumentBuilderFactory.newInstance();
試す {
DocumentBuilder ビルダー = Factory.newDocumentBuilder();
StringReader sr = 新しい StringReader(strXML);
入力ソースは = 新しい入力ソース(sr);
ドキュメント doc = builder.parse(is);
XPathFactory xFactory = XPathFactory.newInstance();
XPath xpath = xFactory.newXPath();
XPathExpression expr = xpath.compile("/root/TelePhone/type");
NodeList 電話 = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i <phones.getLength(); i++) {
ノードタイプ =phones.item(i);
String PhoneName = ((要素)タイプ).getAttribute("名前");
System.out.println("電話名 = "+電話名);
XPathExpression expr1 = xpath.compile("./*");
NodeList list = (NodeList) expr1.evaluate(type, XPathConstants.NODESET);
for(int j =0;j<list.getLength();j++){
要素 e1 = (要素) list.item(j);
System.out.println(e1.getNodeName()+"="+e1.getTextContent());
}
}
} catch (ParserConfigurationException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}catch (SAXException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} キャッチ (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}catch (XPathExpressionException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
/**
* @param 引数
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド スタブ
文字列 strXML="<?xml version=/"1.0/" エンコーディング=/"UTF-8/" スタンドアロン=/"no/"?>"+
"<ルート>"+
「<電話>」+
"<type name="nokia/">"+
"<価格>599</価格>"+
"<オペレーター>CMCC</オペレーター>"+
"</type>"+
"<type name="xiaomi/">"+
"<価格>699</価格>"+
"<オペレーター>チャイナネット</オペレーター>"+
"</type>"+
"</電話>"+
"</root>";
XMLHandler ハンドラー = new XMLHandler();
handler.parserXML(strXML);
}
}
PS: 参考までに、XML 操作用のオンライン ツールをいくつか紹介します。
オンライン XML/JSON 変換ツール:
http://tools.VeVB.COm/code/xmljson
XML のオンライン フォーマット/XML のオンライン圧縮:
http://tools.VeVB.COm/code/xmlformat
XMLオンライン圧縮/フォーマットツール:
http://tools.VeVB.COm/code/xml_format_compress