ローカル XML ファイルを読み取り、DOM を介して解析します。DOM 解析の特徴は、XML ファイル全体をメモリにロードして DOM ツリー構造を形成することです。このツリー構造は、トラバースと操作に便利です。
DOM 解析の特徴は、xml ファイルを読み取って dom ツリー構造に変換し、ノードを横断することです。
これは W3c のノードの概念です
XML に大量のデータが含まれる場合、DOM は XML を一度にメモリにロードする特性から、大量のデータを含む XML の解析には適していません。大量の XML が含まれる場合、SAX で解析するとメモリが節約されます。
以下は、DOM を使用して XML ファイルを解析する例です。
XML ファイルの構造は次のとおりです。
<?xml version="1.0"coding="ISO-8859-1"?><bookstore> <book category="cooking"> <title lang="en">まいにちイタリア語</title> <author>ジャーダ・デ・ラウレンティス</author> <year>2005</year> <price>30.00</price> </book> <book category="children"> <title lang="ja">ハリー ポッター</title> <author>J K.ローリング</著者> <year>2005</year> <price>29.99</price> </book> <book category="web"> <title lang="ja">XQuery キック スタート</title> <著者>James McGovern</著者> <年>2003</year> <price>49.99</price> </book> <book category="web" cover="paperback"> <title lang="ja">ラーニング XML</title> <著者>エリック・T・レイ</著者> <年>2003</年> <価格>39.95</価格> </本></書店>
次のように XML を解析するクラスを作成します。
パッケージ xml.dom;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org .w3c.dom.Node;org.w3c.dom.NodeList をインポート;パブリック クラスReadXmlFile { public static void main(String[] args) { try{ File xmlFile = new File("src/resource/book.xml"); DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();ドキュメント doc = builder.parse(xmlFile); doc.getDocumentElement().normalize(); System.out.println("ルート要素: "+doc.getDocumentElement().getNodeName()); 0 ; i<nList.getLength();i++){ ノードノード = nList.item(i); System.out.println("ノード名: "+node.getNodeName()); 要素 ele = (要素)node("-------------- ------------"); if(node.getNodeType() == Element.ELEMENT_NODE){ System.out.println("本のカテゴリ: "+ ele.getAttribute("カテゴリ")) ; System.out.println("タイトル名: "+ ele.getElementsByTagName("タイトル").item(0).getTextContent()); System.out.println("著者名: "+ele.getElementsByTagName("著者").item(0).getTextContent()); System.out.println("年:"+ele.getElementsByTagName("年").item(0).getTextContent()); System.out.println("価格 : "+ele.getElementsByTagName("価格").item(0).getTextContent() ); System.out.println("----------------------");
分析結果:
ルート要素: 書店ノード名: 本--------------------------本のカテゴリ: 料理タイトル名: 毎日のイタリア語著者名: ジャーダ・デ・ラウレンティス年: 2005価格: 30.00 ------------------------ノード名: book--------------- --- -------本のカテゴリ: 児童書タイトル名: ハリー・ポッター著者名: J K. ローリング出版年: 2005価格: 29.99---------------------- --ノード名: 本---------------本のカテゴリ: ウェブタイトル名: XQuery Kick Startauthor名前: James McGovern年: 2003価格: 49.99----------------------ノード名: 本------------- ---------------書籍カテゴリ: ウェブタイトル名: Learning XML著者名: Erik T. Ray年: 2003価格: 39.95--------------- --------
上記は、名前を通じて対応する値を取得することです。
以下は、ループ ノードを使用した出力です。
ループノード出力モードのコードは次のとおりです。
パッケージ xml.dom;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org .w3c.dom.Node;インポートorg.w3c.dom.NodeList; public class ReadXmlFile2 { public static void main(String[] args) { try{ File xmlFile = new File("src/resource/book.xml"); ; DocumentBuilder ビルダー = builderFactory.newDocumentBuilder(); builder.parse(xmlFile); doc.getDocumentElement().normalize(); System.out.println("ルート要素: "+doc.getDocumentElement().getNodeName()); if(doc.hasChildNodes()); (doc.getChildNodes()); } }catch(Exception e){ e.printStackTrace() } } public static void printNode(NodeList nodeList){ System.out.println("------------------------"); // System.out.println(nodeList. getLength()); for(int i = 0; i<nodeList.getLength(); i++){ ノードノード = (Node)nodeList.item(i); if(node.getNodeType() == Node.ELEMENT_NODE){ System.out.println("ノード名: "+node.getNodeName()); System.out.println("ノード値: "+node.getTextContent()); node.getAttributes(); for(int j = 0; j < nodeMap.getLength(); j++){ ノード nodenew = nodeMap.item(j); System.out.println("ノード名"+nodenew.getNodeName()); System.out.println("ノード値"+nodenew.getNodeValue()); ()){ printNode(node.getChildNodes()) } } } }
出力は次のとおりです。
ルート要素: 書店------------------------ノード名: 書店ノード値: Everyday Italian Giada De Latiniis 2005 30.00 Harry Potter J K. Rowling 2005 29.99 XQueryキックスタート James McGovern 2003 49.99 XML の学習 Erik T. Ray 2003 39.95 ------------------ノード名: booknode 値: Everyday Italian Giada De Launchiis 2005 30.00 ノード名カテゴリノード値クッキング--------------------------ノード名: タイトルノード値: Everyday Italianノード名 langノード値 en------ ------------------ノード名: 著者ノード値: Giada De Latiniis---------------------- - ノード名: 年ノード値: 2005----------------------ノード名: 価格ノード値: 30.00----------- - ------------ノード名: bookノード値: Harry Potter J K. Rowling 2005 29.99 ノード名カテゴリノード値子--------------------------ノード名: タイトルノード値: ハリー・ポッターノード名 lang ノード値 en-------- ----------------ノード名: 著者ノード値: J K. Rowling---------------------- -------- ノード名: 年 ノード値: 2005 ------------------------ ノード名: 価格 ノード値: 29.99 ---- -------- ------------ノード名: ブックノード値: XQuery Kick Start James McGovern 2003 49.99 ノード名categorynode 値 web---------------ノード名: titlenode 値: XQuery Kick Startnode 名 langnode 値 en---------- ---------------ノード名: 著者ノード値: James McGovern--------------------------ノード名前: 年ノード値: 2003---------------------ノード名: 価格ノード値: 49.99----- ----------- --------ノード名: ブックノード値: Learning XML Erik T. Ray 2003 39.95 ノード名カテゴリノード値 Web ノード名covernode 値ペーパーバック--------------------------ノード名: タイトルノード値: Learning XML ノード名 langnode 値 en---------- - ------------ノード名: 著者ノード値: Erik T. Ray--------------------------ノード名: 年ノード値: 2003--------------------------ノード名: 価格ノード値: 39.95-------------- - ----------
ノードに関する質問:
<book category="cooking"> <title lang="ja">まいにちイタリア語</title> <著者>ジャーダ・デ・ラウレンティス</著者> <年>2005</年> <価格>30.00</価格> </本>
書籍アプリケーションの場合: doc.getChildNodes() は、NodeList の長さが 9 である NodeList を取得します。
9つのノードは次のとおりです。
タイトルノード
ラングノード
日常ノード
著者ノード
ジャーダ・デ・ラウレンティスノード
年ノード
2005 ノード
価格ノード
30.00ノード