Java-xml-quick-guide

提供:Dev Guides
移動先:案内検索

Java XML-概要

XMLとは何ですか?

XMLは、プレーンテキスト形式でデータを保存および転送するために設計されたシンプルなテキストベースの言語です。 Extensible Markup Languageの略です。 以下は、XMLの主要な機能の一部です。

  • XMLはマークアップ言語です。
  • XMLは、HTMLのようなタグベースの言語です。
  • XMLタグは、HTMLのように事前定義されていません。
  • 独自のタグを定義できるため、拡張可能言語と呼ばれます。
  • XMLタグは、自己記述的になるように設計されています。
  • XMLは、データストレージとデータ転送に関するW3C勧告です。

<?xml version = "1.0"?>
<Class>
   <Name>First</Name>
   <Sections>
      <Section>
         <Name>A</Name>
         <Students>
            <Student>Rohan</Student>
            <Student>Mohan</Student>
            <Student>Sohan</Student>
            <Student>Lalit</Student>
            <Student>Vinay</Student>
         </Students>
      </Section>

      <Section>
         <Name>B</Name>
         <Students>
            <Student>Robert</Student>
            <Student>Julie</Student>
            <Student>Kalie</Student>
            <Student>Michael</Student>
         </Students>
      </Section>
   </Sections>
</Class>

利点

XMLが提供する利点は次のとおりです-

  • テクノロジーにとらわれない-XMLはプレーンテキストなので、テクノロジーに依存しません。 データストレージおよびデータ転送の目的で、あらゆるテクノロジーで使用できます。
  • 人間が読める-XMLは単純なテキスト形式を使用します。 それは人間が読んで理解できるものです。
  • 拡張可能-XMLでは、カスタムタグを非常に簡単に作成して使用できます。
  • Allow Validation -XSD、DTD、およびXML構造を使用すると、簡単に検証できます。

デメリット

以下は、XMLを使用することの欠点です-

  • 冗長構文-通常、XMLファイルには多くの繰り返し用語が含まれています。
  • 冗長-冗長言語であるため、XMLファイルのサイズは送信およびストレージのコストを増加させます。

Java XML-パーサー

XML解析とは、データにアクセスしたりデータを変更したりするためにXMLドキュメントを通過することです。

XMLパーサーとは何ですか?

XMLパーサーは、XMLドキュメント内のデータにアクセスまたは変更する方法を提供します。 Javaは、XMLドキュメントを解析するための複数のオプションを提供します。 以下は、XMLドキュメントの解析に一般的に使用されるさまざまなタイプのパーサーです。

  • Dom Parser -ドキュメントの完全なコンテンツをロードし、メモリ内に完全な階層ツリーを作成することにより、XMLドキュメントを解析します。
  • SAX Parser -イベントベースのトリガーでXMLドキュメントを解析します。 完全なドキュメントをメモリにロードしません。
  • * JDOMパーサー*-DOMパーサーと同様の方法で、より簡単な方法でXMLドキュメントを解析します。
  • StAX Parser -SAXパーサーと同様の方法で、より効率的な方法でXMLドキュメントを解析します。
  • XPath Parser -式に基づいてXMLドキュメントを解析し、XSLTと組み合わせて広く使用されます。
  • DOM4J Parser -Java Collections Frameworkを使用してXML、XPath、およびXSLTを解析するJavaライブラリ。 DOM、SAX、およびJAXPのサポートを提供します。

オブジェクト指向の方法でXML解析を処理するために利用可能なJAXBおよびXSLT APIがあります。 このチュートリアルの以降の章で、各パーサーについて詳しく説明します。

Java DOMパーサー-概要

Document Object Model(DOM)は、World Wide Web Consortium(W3C)の公式勧告です。 プログラムがXMLドキュメントのスタイル、構造、コンテンツにアクセスして更新できるようにするインターフェイスを定義します。 DOMをサポートするXMLパーサーは、このインターフェイスを実装します。

使用する場合

次の場合は、DOMパーサーを使用する必要があります-

  • ドキュメントの構造について多くを知る必要があります。
  • XMLドキュメントの一部を移動する必要があります(たとえば、特定の要素を並べ替えたい場合があります)。
  • XMLドキュメントの情報を複数回使用する必要があります。

あなたは何を得ますか?

DOMパーサーでXMLドキュメントを解析すると、ドキュメントのすべての要素を含むツリー構造が返されます。 DOMは、ドキュメントの内容と構造を調べるために使用できるさまざまな機能を提供します。

利点

DOMは、ドキュメント構造を操作するための一般的なインターフェイスです。 その設計目標の1つは、1つのDOM準拠パーサー用に記述されたJavaコードを、変更を行わずに他のDOM準拠パーサーで実行することです。

DOMインターフェース

DOMはいくつかのJavaインターフェースを定義します。 最も一般的なインターフェイスは次のとおりです-

  • Node -DOMの基本データ型。
  • 要素-扱うオブジェクトの大部分は要素です。
  • Attr -要素の属性を表します。
  • テキスト-要素または属性の実際のコンテンツ。
  • ドキュメント-XMLドキュメント全体を表します。 Documentオブジェクトは、多くの場合、DOMツリーと呼ばれます。

一般的なDOMメソッド

あなたがDOMで作業しているとき、あなたが頻繁に使用するいくつかの方法があります-

  • * Document.getDocumentElement()*-ドキュメントのルート要素を返します。
  • * Node.getFirstChild()*-指定されたノードの最初の子を返します。
  • * Node.getLastChild()*-指定されたノードの最後の子を返します。
  • * Node.getNextSibling()*-これらのメソッドは、指定されたノードの次の兄弟を返します。
  • * Node.getPreviousSibling()*-これらのメソッドは、指定されたノードの前の兄弟を返します。
  • * Node.getAttribute(attrName)*-特定のノードについて、要求された名前の属性を返します。

Java DOM Parser-XMLドキュメントの解析

JDOMを使用する手順

以下は、JDOMパーサーを使用してドキュメントを解析するときに使用される手順です。

  • XML関連のパッケージをインポートします。
  • SAXBuilderを作成します。
  • ファイルまたはストリームからドキュメントを作成する
  • ルート要素を抽出する
  • 属性を調べる
  • サブ要素を調べる

XML関連のパッケージをインポートする

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;

DocumentBuilderを作成する

DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

ファイルまたはストリームからドキュメントを作成する

StringBuilder xmlStringBuilder = new StringBuilder();
xmlStringBuilder.append("<?xml version="1.0"?> <class> </class>");
ByteArrayInputStream input = new ByteArrayInputStream(
   xmlStringBuilder.toString().getBytes("UTF-8"));
Document doc = builder.parse(input);

ルート要素を抽出する

Element root = document.getDocumentElement();

属性を調べる

//returns specific attribute
getAttribute("attributeName");

//returns a Map (table) of names/values
getAttributes();

サブ要素を調べる

//returns a list of subelements of specified name
getElementsByTagName("subelementName");

//returns a list of all child nodes
getChildNodes();

デモ例

解析する必要がある入力xmlファイルは次のとおりです-

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

DomParserDemo.java

package com.finddevguides.xml;

import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;

public class DomParserDemo {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.txt");
         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
         Document doc = dBuilder.parse(inputFile);
         doc.getDocumentElement().normalize();
         System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
         NodeList nList = doc.getElementsByTagName("student");
         System.out.println("----------------------------");

         for (int temp = 0; temp < nList.getLength(); temp++) {
            Node nNode = nList.item(temp);
            System.out.println("\nCurrent Element :" + nNode.getNodeName());

            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
               Element eElement = (Element) nNode;
               System.out.println("Student roll no : "
                  + eElement.getAttribute("rollno"));
               System.out.println("First Name : "
                  + eElement
                  .getElementsByTagName("firstname")
                  .item(0)
                  .getTextContent());
               System.out.println("Last Name : "
                  + eElement
                  .getElementsByTagName("lastname")
                  .item(0)
                  .getTextContent());
               System.out.println("Nick Name : "
                  + eElement
                  .getElementsByTagName("nickname")
                  .item(0)
                  .getTextContent());
               System.out.println("Marks : "
                  + eElement
                  .getElementsByTagName("marks")
                  .item(0)
                  .getTextContent());
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

Root element :class
----------------------------

Current Element :student
Student roll no : 393
First Name : dinkar
Last Name : kad
Nick Name : dinkar
Marks : 85

Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
Nick Name : vinni
Marks : 95

Current Element :student
Student roll no : 593
First Name : jasvir
Last Name : singn
Nick Name : jazz
Marks : 90

Java DOM Parser-XMLドキュメントのクエリ

デモ例

ここにクエリする必要がある入力xmlファイルがあります-

<?xml version = "1.0"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferarri 101</carname>
      <carname type = "sports car">Ferarri 201</carname>
      <carname type = "sports car">Ferarri 301</carname>
   </supercars>

   <supercars company = "Lamborgini">
      <carname>Lamborgini 001</carname>
      <carname>Lamborgini 002</carname>
      <carname>Lamborgini 003</carname>
   </supercars>

   <luxurycars company = "Benteley">
      <carname>Benteley 1</carname>
      <carname>Benteley 2</carname>
      <carname>Benteley 3</carname>
   </luxurycars>
</cars>

QueryXmlFileDemo.java

package com.finddevguides.xml;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class QueryXmlFileDemo {

   public static void main(String argv[]) {

      try {
         File inputFile = new File("input.txt");
         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
         Document doc = dBuilder.parse(inputFile);
         doc.getDocumentElement().normalize();
         System.out.print("Root element: ");
         System.out.println(doc.getDocumentElement().getNodeName());
         NodeList nList = doc.getElementsByTagName("supercars");
         System.out.println("----------------------------");

         for (int temp = 0; temp < nList.getLength(); temp++) {
            Node nNode = nList.item(temp);
            System.out.println("\nCurrent Element :");
            System.out.print(nNode.getNodeName());

            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
               Element eElement = (Element) nNode;
               System.out.print("company : ");
               System.out.println(eElement.getAttribute("company"));
               NodeList carNameList = eElement.getElementsByTagName("carname");

               for (int count = 0; count < carNameList.getLength(); count++) {
                  Node node1 = carNameList.item(count);

                  if (node1.getNodeType() == node1.ELEMENT_NODE) {
                     Element car = (Element) node1;
                     System.out.print("car name : ");
                     System.out.println(car.getTextContent());
                     System.out.print("car type : ");
                     System.out.println(car.getAttribute("type"));
                  }
               }
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

Root element: cars
----------------------------

Current Element :
supercarscompany : Ferrari
car name : Ferarri 101
car type : formula one
car name : Ferarri 201
car type : sports car
car name : Ferarri 301
car type : sports car

Current Element :
supercarscompany : Lamborgini
car name : Lamborgini 001
car type :
car name : Lamborgini 002
car type :
car name : Lamborgini 003
car type :

Java DOMパーサー-XMLドキュメントの作成

デモ例

ここに作成する必要があるXMLがあります-

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferrari 101</carname>
      <carname type = "sports">Ferrari 202</carname>
   </supercars>
</cars>

CreateXmlFileDemo.java

package com.finddevguides.xml;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.File;

public class CreateXmlFileDemo {

   public static void main(String argv[]) {

      try {
         DocumentBuilderFactory dbFactory =
         DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
         Document doc = dBuilder.newDocument();

        //root element
         Element rootElement = doc.createElement("cars");
         doc.appendChild(rootElement);

        //supercars element
         Element supercar = doc.createElement("supercars");
         rootElement.appendChild(supercar);

        //setting attribute to element
         Attr attr = doc.createAttribute("company");
         attr.setValue("Ferrari");
         supercar.setAttributeNode(attr);

        //carname element
         Element carname = doc.createElement("carname");
         Attr attrType = doc.createAttribute("type");
         attrType.setValue("formula one");
         carname.setAttributeNode(attrType);
         carname.appendChild(doc.createTextNode("Ferrari 101"));
         supercar.appendChild(carname);

         Element carname1 = doc.createElement("carname");
         Attr attrType1 = doc.createAttribute("type");
         attrType1.setValue("sports");
         carname1.setAttributeNode(attrType1);
         carname1.appendChild(doc.createTextNode("Ferrari 202"));
         supercar.appendChild(carname1);

        //write the content into xml file
         TransformerFactory transformerFactory = TransformerFactory.newInstance();
         Transformer transformer = transformerFactory.newTransformer();
         DOMSource source = new DOMSource(doc);
         StreamResult result = new StreamResult(new File("C:\\cars.xml"));
         transformer.transform(source, result);

        //Output to console for testing
         StreamResult consoleResult = new StreamResult(System.out);
         transformer.transform(source, consoleResult);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>

<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferrari 101</carname>
      <carname type = "sports">Ferrari 202</carname>
   </supercars>
</cars>

Java DOMパーサー-XMLドキュメントの変更

デモ例

変更する必要がある入力xmlファイルは次のとおりです-

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferrari 101</carname>
      <carname type = "sports">Ferrari 202</carname>
   </supercars>

   <luxurycars company = "Benteley">
      <carname>Benteley 1</carname>
      <carname>Benteley 2</carname>
      <carname>Benteley 3</carname>
   </luxurycars>
</cars>

ModifyXmlFileDemo.java

package com.finddevguides.xml;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ModifyXmlFileDemo {

   public static void main(String argv[]) {

      try {
         File inputFile = new File("input.xml");
         DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
         Document doc = docBuilder.parse(inputFile);
         Node cars = doc.getFirstChild();
         Node supercar = doc.getElementsByTagName("supercars").item(0);

        //update supercar attribute
         NamedNodeMap attr = supercar.getAttributes();
         Node nodeAttr = attr.getNamedItem("company");
         nodeAttr.setTextContent("Lamborigini");

        //loop the supercar child node
         NodeList list = supercar.getChildNodes();

         for (int temp = 0; temp < list.getLength(); temp++) {
            Node node = list.item(temp);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
               Element eElement = (Element) node;
               if ("carname".equals(eElement.getNodeName())) {
                  if("Ferrari 101".equals(eElement.getTextContent())) {
                     eElement.setTextContent("Lamborigini 001");
                  }
                  if("Ferrari 202".equals(eElement.getTextContent()))
                     eElement.setTextContent("Lamborigini 002");
               }
            }
         }
         NodeList childNodes = cars.getChildNodes();

         for(int count = 0; count < childNodes.getLength(); count++) {
            Node node = childNodes.item(count);

            if("luxurycars".equals(node.getNodeName()))
               cars.removeChild(node);
         }

        //write the content on console
         TransformerFactory transformerFactory = TransformerFactory.newInstance();
         Transformer transformer = transformerFactory.newTransformer();
         DOMSource source = new DOMSource(doc);
         System.out.println("-----------Modified File-----------");
         StreamResult consoleResult = new StreamResult(System.out);
         transformer.transform(source, consoleResult);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

-----------Modified File-----------
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>

<cars>
   <supercars company = "Lamborigini">
      <carname type = "formula one">Lamborigini 001</carname>
      <carname type = "sports">Lamborigini 002</carname>
   </supercars>
</cars>

Java SAXパーサー-概要

SAX(Simple API for XML)は、XMLドキュメント用のイベントベースのパーサーです。 DOMパーサーとは異なり、SAXパーサーは解析ツリーを作成しません。 SAXはXMLのストリーミングインターフェイスです。つまり、SAXを使用するアプリケーションは、処理中のXMLドキュメントに関するイベント通知を、ドキュメントの先頭から始まり、ドキュメントの終了で終わる順番に、要素と属性で受け取ることを意味します。 ROOT要素。

  • 整形式のXMLドキュメントを構成するトークンを認識して、XMLドキュメントを上から下に読み取ります。
  • トークンは、ドキュメントに表示されるのと同じ順序で処理されます。
  • パーサーが発生したときに遭遇したトークンの性質をアプリケーションプログラムに報告します。
  • アプリケーションプログラムは、パーサーに登録する必要がある「イベント」ハンドラーを提供します。
  • トークンが識別されると、ハンドラー内のコールバックメソッドが関連情報とともに呼び出されます。

使用する場合

あなたはSAXパーサーを使用する必要があります-

  • XMLドキュメントを上から下に直線的に処理できます。
  • ドキュメントは深くネストされていません。
  • DOMツリーが大量のメモリを消費する非常に大きなXMLドキュメントを処理しています。 典型的なDOM実装では、10バイトのメモリを使用して1バイトのXMLを表します。
  • 解決すべき問題は、XMLドキュメントの一部のみです。
  • パーサーがデータを見るとすぐにデータが利用できるため、SAXはストリームを介して到着するXMLドキュメントに適しています。

SAXの欠点

  • XMLドキュメントは順方向のみで処理されるため、XMLドキュメントへのランダムアクセスはありません。
  • パーサーが表示したデータを追跡する必要がある場合、またはアイテムの順序を変更する必要がある場合は、コードを記述し、データを独自に保存する必要があります。

ContentHandlerインターフェース

このインターフェイスは、SAXパーサーがアプリケーションプログラムにXMLドキュメントのコンポーネントを通知するために使用するコールバックメソッドを指定します。

  • * void startDocument()*-ドキュメントの先頭で呼び出されます。
  • * void endDocument()*-文書の終わりに呼び出されます。
  • * void startElement(String uri、String localName、String qName、Attributes atts)*-要素の先頭で呼び出されます。
  • * void endElement(String uri、String localName、String qName)*-要素の終わりに呼び出されます。
  • * void characters(char [] ch、int start、int length)*-文字データが検出されたときに呼び出されます。
  • * void ignorableWhitespace(char [] ch、int start、int length)*-DTDが存在し、無視可能な空白が見つかったときに呼び出されます。
  • * void processingInstruction(String target、String data)*-処理命令が認識されると呼び出されます。
  • * void setDocumentLocator(Locator locator))*-文書内の位置を識別するために使用できるロケーターを提供します。
  • * void skippedEntity(String name)*-未解決のエンティティが見つかったときに呼び出されます。
  • * void startPrefixMapping(String prefix、String uri)*-新しい名前空間マッピングが定義されると呼び出されます。
  • * void endPrefixMapping(String prefix)*-名前空間定義がスコープを終了するときに呼び出されます。

属性インターフェイス

このインターフェイスは、要素に接続された属性を処理するためのメソッドを指定します。

  • * int getLength()*-属性の数を返します。
  • * String getQName(int index)*
  • * String getValue(int index)*
  • * String getValue(String qname)*

Java SAXパーサー-XMLドキュメントの解析

デモ例

これは、解析する必要がある入力xmlファイルです-

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

UserHandler.java

package com.finddevguides.xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class UserHandler extends DefaultHandler {

   boolean bFirstName = false;
   boolean bLastName = false;
   boolean bNickName = false;
   boolean bMarks = false;

   @Override
   public void startElement(String uri,
   String localName, String qName, Attributes attributes) throws SAXException {

      if (qName.equalsIgnoreCase("student")) {
         String rollNo = attributes.getValue("rollno");
         System.out.println("Roll No : " + rollNo);
      } else if (qName.equalsIgnoreCase("firstname")) {
         bFirstName = true;
      } else if (qName.equalsIgnoreCase("lastname")) {
         bLastName = true;
      } else if (qName.equalsIgnoreCase("nickname")) {
         bNickName = true;
      }
      else if (qName.equalsIgnoreCase("marks")) {
         bMarks = true;
      }
   }

   @Override
   public void endElement(String uri,
   String localName, String qName) throws SAXException {
      if (qName.equalsIgnoreCase("student")) {
         System.out.println("End Element :" + qName);
      }
   }

   @Override
   public void characters(char ch[], int start, int length) throws SAXException {

      if (bFirstName) {
         System.out.println("First Name: "
            + new String(ch, start, length));
         bFirstName = false;
      } else if (bLastName) {
         System.out.println("Last Name: " + new String(ch, start, length));
         bLastName = false;
      } else if (bNickName) {
         System.out.println("Nick Name: " + new String(ch, start, length));
         bNickName = false;
      } else if (bMarks) {
         System.out.println("Marks: " + new String(ch, start, length));
         bMarks = false;
      }
   }
}

SAXParserDemo.java

package com.finddevguides.xml;

import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXParserDemo {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.txt");
         SAXParserFactory factory = SAXParserFactory.newInstance();
         SAXParser saxParser = factory.newSAXParser();
         UserHandler userhandler = new UserHandler();
         saxParser.parse(inputFile, userhandler);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

class UserHandler extends DefaultHandler {

   boolean bFirstName = false;
   boolean bLastName = false;
   boolean bNickName = false;
   boolean bMarks = false;

   @Override
   public void startElement(
      String uri, String localName, String qName, Attributes attributes)
      throws SAXException {

      if (qName.equalsIgnoreCase("student")) {
         String rollNo = attributes.getValue("rollno");
         System.out.println("Roll No : " + rollNo);
      } else if (qName.equalsIgnoreCase("firstname")) {
         bFirstName = true;
      } else if (qName.equalsIgnoreCase("lastname")) {
         bLastName = true;
      } else if (qName.equalsIgnoreCase("nickname")) {
         bNickName = true;
      }
      else if (qName.equalsIgnoreCase("marks")) {
         bMarks = true;
      }
   }

   @Override
   public void endElement(String uri,
      String localName, String qName) throws SAXException {

      if (qName.equalsIgnoreCase("student")) {
         System.out.println("End Element :" + qName);
      }
   }

   @Override
   public void characters(char ch[], int start, int length) throws SAXException {

      if (bFirstName) {
         System.out.println("First Name: " + new String(ch, start, length));
         bFirstName = false;
      } else if (bLastName) {
         System.out.println("Last Name: " + new String(ch, start, length));
         bLastName = false;
      } else if (bNickName) {
         System.out.println("Nick Name: " + new String(ch, start, length));
         bNickName = false;
      } else if (bMarks) {
         System.out.println("Marks: " + new String(ch, start, length));
         bMarks = false;
      }
   }
}

これは、次の結果を生成します-

Roll No : 393
First Name: dinkar
Last Name: kad
Nick Name: dinkar
Marks: 85
End Element :student
Roll No : 493
First Name: Vaneet
Last Name: Gupta
Nick Name: vinni
Marks: 95
End Element :student
Roll No : 593
First Name: jasvir
Last Name: singn
Nick Name: jazz
Marks: 90
End Element :student

Java SAXパーサー-XMLドキュメントのクエリ

デモ例

以下は、rollnoを照会するために必要な入力テキストファイルです。

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

UserHandler.java

package com.finddevguides.xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class UserHandler extends DefaultHandler {

   boolean bFirstName = false;
   boolean bLastName = false;
   boolean bNickName = false;
   boolean bMarks = false;
   String rollNo = null;

   @Override
   public void startElement(
      String uri, String localName, String qName, Attributes attributes)
      throws SAXException {

      if (qName.equalsIgnoreCase("student")) {
         rollNo = attributes.getValue("rollno");
      }
      if(("393").equals(rollNo) &&
         qName.equalsIgnoreCase("student")) {
         System.out.println("Start Element :" + qName);
      }
      if (qName.equalsIgnoreCase("firstname")) {
         bFirstName = true;
      } else if (qName.equalsIgnoreCase("lastname")) {
         bLastName = true;
      } else if (qName.equalsIgnoreCase("nickname")) {
         bNickName = true;
      }
      else if (qName.equalsIgnoreCase("marks")) {
         bMarks = true;
      }
   }

   @Override
   public void endElement(
      String uri, String localName, String qName) throws SAXException {

      if (qName.equalsIgnoreCase("student")) {
         if(("393").equals(rollNo) && qName.equalsIgnoreCase("student"))
         System.out.println("End Element :" + qName);
      }
   }

   @Override
   public void characters(char ch[], int start, int length) throws SAXException {

      if (bFirstName && ("393").equals(rollNo)) {
        //age element, set Employee age
         System.out.println("First Name: " + new String(ch, start, length));
         bFirstName = false;
      } else if (bLastName && ("393").equals(rollNo)) {
         System.out.println("Last Name: " + new String(ch, start, length));
         bLastName = false;
      } else if (bNickName && ("393").equals(rollNo)) {
         System.out.println("Nick Name: " + new String(ch, start, length));
         bNickName = false;
      } else if (bMarks && ("393").equals(rollNo)) {
         System.out.println("Marks: " + new String(ch, start, length));
         bMarks = false;
      }
   }
}

SAXQueryDemo.java

package com.finddevguides.xml;

import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXQueryDemo {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.txt");
         SAXParserFactory factory = SAXParserFactory.newInstance();
         SAXParser saxParser = factory.newSAXParser();
         UserHandler userhandler = new UserHandler();
         saxParser.parse(inputFile, userhandler);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

class UserHandler extends DefaultHandler {

   boolean bFirstName = false;
   boolean bLastName = false;
   boolean bNickName = false;
   boolean bMarks = false;
   String rollNo = null;

   @Override
   public void startElement(String uri,
      String localName, String qName, Attributes attributes)
      throws SAXException {

      if (qName.equalsIgnoreCase("student")) {
         rollNo = attributes.getValue("rollno");
      }
      if(("393").equals(rollNo) && qName.equalsIgnoreCase("student")) {
         System.out.println("Start Element :" + qName);
      }
      if (qName.equalsIgnoreCase("firstname")) {
         bFirstName = true;
      } else if (qName.equalsIgnoreCase("lastname")) {
         bLastName = true;
      } else if (qName.equalsIgnoreCase("nickname")) {
         bNickName = true;
      }
      else if (qName.equalsIgnoreCase("marks")) {
         bMarks = true;
      }
   }

   @Override
   public void endElement(
      String uri, String localName, String qName) throws SAXException {

      if (qName.equalsIgnoreCase("student")) {

         if(("393").equals(rollNo)
            && qName.equalsIgnoreCase("student"))
            System.out.println("End Element :" + qName);
      }
   }


   @Override
   public void characters(
      char ch[], int start, int length) throws SAXException {

      if (bFirstName && ("393").equals(rollNo)) {
        //age element, set Employee age
         System.out.println("First Name: " + new String(ch, start, length));
         bFirstName = false;
      } else if (bLastName && ("393").equals(rollNo)) {
         System.out.println("Last Name: " + new String(ch, start, length));
         bLastName = false;
      } else if (bNickName && ("393").equals(rollNo)) {
         System.out.println("Nick Name: " + new String(ch, start, length));
         bNickName = false;
      } else if (bMarks && ("393").equals(rollNo)) {
         System.out.println("Marks: " + new String(ch, start, length));
         bMarks = false;
      }
   }
}

これは、次の結果を生成します-

Start Element :student
First Name: dinkar
Last Name: kad
Nick Name: dinkar
Marks: 85
End Element :student

Java SAXパーサー-XMLドキュメントの作成

  • XMLドキュメントの作成には、SAXパーサーを使用するよりも、StAXパーサーを使用することをお勧めします。 同じことについては、Java StAX Parserセクションを参照してください。*

Java SAXパーサー-XMLドキュメントの変更

デモ例

</marks>タグの最後に<Result> Pass <Result/>を追加して変更する必要がある入力XMLファイルを次に示します。

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

SAXModifyDemo.java

package com.finddevguides.xml;

import java.io.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import org.xml.sax.helpers.DefaultHandler;

public class SAXModifyDemo extends DefaultHandler {
   static String displayText[] = new String[1000];
   static int numberLines = 0;
   static String indentation = "";

   public static void main(String args[]) {

      try {
         File inputFile = new File("input.txt");
         SAXParserFactory factory =
         SAXParserFactory.newInstance();
         SAXModifyDemo obj = new SAXModifyDemo();
         obj.childLoop(inputFile);
         FileWriter filewriter = new FileWriter("newfile.xml");

         for(int loopIndex = 0; loopIndex < numberLines; loopIndex++) {
            filewriter.write(displayText[loopIndex].toCharArray());
            filewriter.write('\n');
            System.out.println(displayText[loopIndex].toString());
         }
         filewriter.close();
      }
      catch (Exception e) {
         e.printStackTrace(System.err);
      }
   }

   public void childLoop(File input) {
      DefaultHandler handler = this;
      SAXParserFactory factory = SAXParserFactory.newInstance();

      try {
         SAXParser saxParser = factory.newSAXParser();
         saxParser.parse(input, handler);
      } catch (Throwable t) {}
   }

   public void startDocument() {
      displayText[numberLines] = indentation;
      displayText[numberLines] += "<?xml version = \"1.0\" encoding = \""+
         "UTF-8" + "\"?>";
      numberLines++;
   }

   public void processingInstruction(String target, String data) {
      displayText[numberLines] = indentation;
      displayText[numberLines] += "<?";
      displayText[numberLines] += target;

      if (data != null && data.length() > 0) {
         displayText[numberLines] += ' ';
         displayText[numberLines] += data;
      }
      displayText[numberLines] += "?>";
      numberLines++;
   }

   public void startElement(String uri, String localName, String qualifiedName,
      Attributes attributes) {

      displayText[numberLines] = indentation;

      indentation += "    ";

      displayText[numberLines] += '<';
      displayText[numberLines] += qualifiedName;

      if (attributes != null) {
         int numberAttributes = attributes.getLength();

         for (int loopIndex = 0; loopIndex < numberAttributes; loopIndex++) {
            displayText[numberLines] += ' ';
            displayText[numberLines] += attributes.getQName(loopIndex);
            displayText[numberLines] += "=\"";
            displayText[numberLines] += attributes.getValue(loopIndex);
            displayText[numberLines] += '"';
         }
      }
      displayText[numberLines] += '>';
      numberLines++;
   }

   public void characters(char characters[], int start, int length) {
      String characterData = (new String(characters, start, length)).trim();

      if(characterData.indexOf("\n") < 0 && characterData.length() > 0) {
         displayText[numberLines] = indentation;
         displayText[numberLines] += characterData;
         numberLines++;
      }
   }

   public void endElement(String uri, String localName, String qualifiedName) {
      indentation = indentation.substring(0, indentation.length() - 4) ;
      displayText[numberLines] = indentation;
      displayText[numberLines] += "</";
      displayText[numberLines] += qualifiedName;
      displayText[numberLines] += '>';
      numberLines++;

      if (qualifiedName.equals("marks")) {
         startElement("", "Result", "Result", null);
         characters("Pass".toCharArray(), 0, "Pass".length());
         endElement("", "Result", "Result");
      }
   }
}

これは、次の結果を生成します-

<?xml version = "1.0" encoding = "UTF-8"?>
<class>
   <student rollno = "393">
      <firstname>
         dinkar
      </firstname>
      <lastname>
         kad
      </lastname>
      <nickname>
         dinkar
      </nickname>
      <marks>
         85
      </marks>
      <Result>
         Pass
      </Result>
   </student>
   <student rollno = "493">
      <firstname>
         Vaneet
      </firstname>
      <lastname>
         Gupta
      </lastname>
      <nickname>
         vinni
      </nickname>
      <marks>
         95
      </marks>
      <Result>
         Pass
      </Result>
   </student>
   <student rollno = "593">
      <firstname>
         jasvir
      </firstname>
      <lastname>
         singn
      </lastname>
      <nickname>
         jazz
      </nickname>
      <marks>
         90
      </marks>
      <Result>
         Pass
      </Result>
   </student>
</class>

Java JDOMパーサー-概要

JDOMは、XMLドキュメントを解析するためのオープンソースのJavaベースのライブラリです。 通常、Java開発者に優しいAPIです。 Javaに最適化されており、ListやArraysなどのJavaコレクションを使用します。

JDOMはDOM APIとSAX APIで動作し、2つの長所を組み合わせます。 メモリフットプリントが小さく、SAXとほぼ同じ速度です。

環境設定

JDOMパーサーを使用するには、アプリケーションのクラスパスにjdom.jarが必要です。 ダウンロードhttp://www.jdom.org/downloads/[jdom-2.0.5.zip。]

使用する場合

次の場合、JDOMパーサーを使用する必要があります-

  • XMLドキュメントの構造について多くを知る必要があります。
  • XMlドキュメントの一部を移動する必要があります(たとえば、特定の要素を並べ替えたい場合があります)。
  • XMLドキュメントの情報を複数回使用する必要があります。
  • あなたはJava開発者であり、XMLのJava最適化解析を活用したいと考えています。

あなたは何を得ますか?

JDOMパーサーでXMLドキュメントを解析すると、アプリケーションのメモリフットプリントに影響を与えることなく、ドキュメントのすべての要素を含むツリー構造を取得する柔軟性が得られます。

JDOMは、ドキュメントが適切に構造化され、構造がわかっている場合に、XMLドキュメントの内容と構造を調べるために使用できるさまざまなユーティリティ関数を提供します。

利点

JDOMは、Java開発者にXML解析コードの柔軟性と保守性を提供します。 これは、軽量で迅速なAPIです。

JDOMクラス

JDOMはいくつかのJavaクラスを定義します。 最も一般的なクラスは次のとおりです-

  • ドキュメント-XMLドキュメント全体を表します。 Documentオブジェクトは、多くの場合、DOMツリーと呼ばれます。
  • Element -XML要素を表します。 要素オブジェクトには、子要素、テキスト、属性、名前空間を操作するメソッドがあります。
  • 属性-要素の属性を表します。 属性には、属性の値を取得および設定するメソッドがあります。 親と属性タイプがあります。
  • テキスト-XMLタグのテキストを表します。
  • コメント-XMLドキュメント内のコメントを表します。

一般的なJDOMメソッド

あなたがJDOMで作業しているとき、あなたが頻繁に使用するいくつかの方法があります-

  • * SAXBuilder.build(xmlSource)()*-xmlソースからJDOMドキュメントをビルドします。
  • * Document.getRootElement()*-XMLのルート要素を取得します。
  • * Element.getName()*-XMLノードの名前を取得します。
  • * Element.getChildren()*-要素のすべての直接の子ノードを取得します。
  • * Node.getChildren(Name)*-指定された名前を持つすべての直接の子ノードを取得します。
  • * Node.getChild(Name)*-指定された名前を持つ最初の子ノードを取得します。

Java JDOMパーサー-XMLドキュメントの解析

JDOMを使用する手順

以下は、JDOMパーサーを使用してドキュメントを解析するときに使用される手順です。

  • XML関連のパッケージをインポートします。
  • SAXBuilderを作成する
  • ファイルまたはストリームからドキュメントを作成する
  • ルート要素を抽出する
  • 属性を調べる
  • サブ要素を調べる

XML関連のパッケージをインポートする

import java.io.*;
import java.util.*;
import org.jdom2.*;

DocumentBuilderを作成する

SAXBuilder saxBuilder = new SAXBuilder();

ファイルまたはストリームからドキュメントを作成する

File inputFile = new File("input.txt");
SAXBuilder saxBuilder = new SAXBuilder();
Document document = saxBuilder.build(inputFile);

ルート要素を抽出する

Element classElement = document.getRootElement();

属性を調べる

//returns specific attribute
getAttribute("attributeName");

サブ要素を調べる

//returns a list of subelements of specified name
getChildren("subelementName");

//returns a list of all child nodes
getChildren();

//returns first child node
getChild("subelementName");

デモ例

これは、解析する必要がある入力xmlファイルです-

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

DomParserDemo.java

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;


public class JDomParserDemo {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.txt");
         SAXBuilder saxBuilder = new SAXBuilder();
         Document document = saxBuilder.build(inputFile);
         System.out.println("Root element :" + document.getRootElement().getName());
         Element classElement = document.getRootElement();

         List<Element> studentList = classElement.getChildren();
         System.out.println("----------------------------");

         for (int temp = 0; temp < studentList.size(); temp++) {
            Element student = studentList.get(temp);
            System.out.println("\nCurrent Element :"
               + student.getName());
            Attribute attribute =  student.getAttribute("rollno");
            System.out.println("Student roll no : "
               + attribute.getValue() );
            System.out.println("First Name : "
               + student.getChild("firstname").getText());
            System.out.println("Last Name : "
               + student.getChild("lastname").getText());
            System.out.println("Nick Name : "
               + student.getChild("nickname").getText());
            System.out.println("Marks : "
               + student.getChild("marks").getText());
         }
      } catch(JDOMException e) {
         e.printStackTrace();
      } catch(IOException ioe) {
         ioe.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

Root element :class
----------------------------

Current Element :student
Student roll no : 393
First Name : dinkar
Last Name : kad
Nick Name : dinkar
Marks : 85

Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
Nick Name : vinni
Marks : 95

Current Element :student
Student roll no : 593
First Name : jasvir
Last Name : singn
Nick Name : jazz
Marks : 90

Java JDOMパーサー-XMLドキュメントのクエリ

デモ例

ここにクエリする必要がある入力xmlファイルがあります-

<?xml version = "1.0"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferarri 101</carname>
      <carname type = "sports car">Ferarri 201</carname>
      <carname type = "sports car">Ferarri 301</carname>
   </supercars>

   <supercars company = "Lamborgini">
      <carname>Lamborgini 001</carname>
      <carname>Lamborgini 002</carname>
      <carname>Lamborgini 003</carname>
   </supercars>

   <luxurycars company = "Benteley">
      <carname>Benteley 1</carname>
      <carname>Benteley 2</carname>
      <carname>Benteley 3</carname>
   </luxurycars>
</cars>

QueryXmlFileDemo.java

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;


public class QueryXmlFileDemo {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.txt");
         SAXBuilder saxBuilder = new SAXBuilder();
         Document document = saxBuilder.build(inputFile);
         System.out.println("Root element :" + document.getRootElement().getName());
         Element classElement = document.getRootElement();

         List<Element> supercarList = classElement.getChildren("supercars");
         System.out.println("----------------------------");

         for (int temp = 0; temp < supercarList.size(); temp++) {
            Element supercarElement = supercarList.get(temp);
            System.out.println("\nCurrent Element :" + supercarElement.getName());
            Attribute attribute = supercarElement.getAttribute("company");
            System.out.println("company : " + attribute.getValue() );
            List<Element> carNameList = supercarElement.getChildren("carname");

            for (int count = 0; count < carNameList.size(); count++) {
               Element carElement = carNameList.get(count);
               System.out.print("car name : ");
               System.out.println(carElement.getText());
               System.out.print("car type : ");
               Attribute typeAttribute = carElement.getAttribute("type");

               if(typeAttribute != null)
                  System.out.println(typeAttribute.getValue());
               else {
                  System.out.println("");
               }
            }
         }
      } catch(JDOMException e) {
         e.printStackTrace();
      } catch(IOException ioe) {
         ioe.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

Root element :cars
----------------------------

Current Element :supercars
company : Ferrari
car name : Ferarri 101
car type : formula one
car name : Ferarri 201
car type : sports car
car name : Ferarri 301
car type : sports car

Current Element :supercars
company : Lamborgini
car name : Lamborgini 001
car type :
car name : Lamborgini 002
car type :
car name : Lamborgini 003
car type :

Java JDOMパーサー-XMLドキュメントの作成

デモ例

ここに作成する必要があるXMLファイルがあります-

<?xml version = "1.0" encoding = "UTF-8"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferrari 101</carname>
      <carname type = "sports">Ferrari 202</carname>
   </supercars>
</cars>

CreateXmlFileDemo.java

import java.io.IOException;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;


public class CreateXmlFileDemo {

   public static void main(String[] args) {

      try{
        //root element
         Element carsElement = new Element("cars");
         Document doc = new Document(carsElement);

        //supercars element
         Element supercarElement = new Element("supercars");
         supercarElement.setAttribute(new Attribute("company","Ferrari"));

        //supercars element
         Element carElement1 = new Element("carname");
         carElement1.setAttribute(new Attribute("type","formula one"));
         carElement1.setText("Ferrari 101");

         Element carElement2 = new Element("carname");
         carElement2.setAttribute(new Attribute("type","sports"));
         carElement2.setText("Ferrari 202");

         supercarElement.addContent(carElement1);
         supercarElement.addContent(carElement2);

         doc.getRootElement().addContent(supercarElement);

         XMLOutputter xmlOutput = new XMLOutputter();

        //display ml
         xmlOutput.setFormat(Format.getPrettyFormat());
         xmlOutput.output(doc, System.out);
      } catch(IOException e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

<?xml version = "1.0" encoding = "UTF-8"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferrari 101</carname>
      <carname type = "sports">Ferrari 202</carname>
   </supercars>
</cars>

Java JDOMパーサー-XMLドキュメントの変更

デモ例

変更する必要がある入力テキストファイルは次のとおりです-

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferrari 101</carname>
      <carname type = "sports">Ferrari 202</carname>
   </supercars>

   <luxurycars company = "Benteley">
      <carname>Benteley 1</carname>
      <carname>Benteley 2</carname>
      <carname>Benteley 3</carname>
   </luxurycars>
</cars>

ModifyXmlFileDemo.java

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;


public class ModifyXMLFileDemo {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.txt");
         SAXBuilder saxBuilder = new SAXBuilder();
         Document document = saxBuilder.build(inputFile);
         Element rootElement = document.getRootElement();

        //get first supercar
         Element supercarElement = rootElement.getChild("supercars");

        //update supercar attribute
         Attribute attribute = supercarElement.getAttribute("company");
         attribute.setValue("Lamborigini");

        //loop the supercar child node
         List<Element> list = supercarElement.getChildren();

         for (int temp = 0; temp < list.size(); temp++) {
            Element carElement = list.get(temp);

            if("Ferrari 101".equals(carElement.getText())) {
               carElement.setText("Lamborigini 001");
            }
            if("Ferrari 202".equals(carElement.getText())) {
               carElement.setText("Lamborigini 002");
            }
         }

        //get all supercars element
         List<Element> supercarslist = rootElement.getChildren();

         for (int temp = 0; temp < supercarslist.size(); temp++) {
            Element tempElement = supercarslist.get(temp);

            if("luxurycars".equals(tempElement.getName())) {
               rootElement.removeContent(tempElement);
            }
         }

         XMLOutputter xmlOutput = new XMLOutputter();

        //display xml
         xmlOutput.setFormat(Format.getPrettyFormat());
         xmlOutput.output(document, System.out);
      } catch (JDOMException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

<?xml version = "1.0" encoding = "UTF-8"?>
<cars>
   <supercars company = "Lamborigini">
      <carname type = "formula one">Lamborigini 001</carname>
      <carname type = "sports">Lamborigini 002</carname>
   </supercars>
</cars>

Java StAXパーサー-概要

StAXは、SAXパーサーと同様の方法でXMLドキュメントを解析するJavaベースのAPIです。 しかし、2つのAPIの間には2つの大きな違いがあります-

  • StAXはPULL APIですが、SAXはPUSH APIです。 つまり、StAXパーサーの場合、クライアントアプリケーションは、必要に応じてStAXパーサーにXMLから情報を取得するように要求する必要があります。 ただし、SAXパーサーの場合、SAXパーサーがクライアントアプリケーションに情報が利用可能であることを通知すると、クライアントアプリケーションは情報を取得する必要があります。
  • StAX APIは、XMLドキュメントの読み取りと書き込みができます。 SAX APIを使用すると、XMLファイルのみを読み取ることができます。

環境設定

StAXパーサーを使用するには、アプリケーションのクラスパスにstax.jarが必要です。

以下は、StAX APIの機能です-

  • 整形式のXMLドキュメントを構成するトークンを認識して、XMLドキュメントを上から下に読み取ります。
  • トークンは、ドキュメントに表示されるのと同じ順序で処理されます。
  • パーサーが発生したときに遭遇したトークンの性質をアプリケーションプログラムに報告します。
  • アプリケーションプログラムは、イテレータとして機能し、イベントを反復処理して必要な情報を取得する「イベント」リーダーを提供します。 別の利用可能なリーダーは、XMLノードへのポインタとして機能する「カーソル」です。
  • イベントが識別されると、イベントオブジェクトからXML要素を取得し、さらに処理できます。

使用する場合

あなたはStAXパーサーを使用する必要があります-

  • XMLドキュメントを上から下に直線的に処理できます。
  • ドキュメントは深くネストされていません。
  • DOMツリーが大量のメモリを消費する非常に大きなXMLドキュメントを処理しています。 典型的なDOM実装では、10バイトのメモリを使用して1バイトのXMLを表します。
  • 解決すべき問題は、XMLドキュメントの一部のみです。
  • パーサーがデータを確認するとすぐにデータが利用できるため、StAXはストリームを介して到着するXMLドキュメントに対して適切に機能します。

SAXの欠点

  • XMLドキュメントへのランダムアクセスはありません。これは、転送のみの方法で処理されるためです。
  • パーサーが見たデータを追跡する必要がある場合、またはパーサーがアイテムの順序を変更した場所を追跡する必要がある場合は、コードを記述してデータを独自に保存する必要があります。

XMLEventReaderクラス

このクラスは、XMLドキュメントの解析中に発生するイベントを反復処理するために使用できるイベントの反復子を提供します。

  • * StartElement asStartElement()*-要素の値と属性を取得するために使用されます。
  • * EndElement asEndElement()*-要素の終わりに呼び出されます。
  • * Characters asCharacters()*-CDATA、空白などの文字を取得するために使用できます。

XMLEventWriterクラス

このインターフェイスは、イベントを作成するためのメソッドを指定します。

  • * add(Event event)*-要素を含むイベントをXMLに追加します。

XMLStreamReaderクラス

このクラスは、XMLドキュメントの解析中に発生するイベントを反復処理するために使用できるイベントの反復子を提供します。

  • * int next()*-次のイベントを取得するために使用されます。
  • * boolean hasNext()*-さらにイベントが存在するかどうかを確認するために使用されます。
  • * String getText()*-要素のテキストを取得するために使用されます。
  • * String getLocalName()*-要素の名前を取得するために使用されます。

XMLStreamWriterクラス

このインターフェイスは、イベントを作成するためのメソッドを指定します。

  • * writeStartElement(String localName)*-指定された名前の開始要素を追加します。
  • * writeEndElement(String localName)*-指定された名前の終了要素を追加します。
  • * writeAttribute(String localName、String value)*-属性を要素に書き込みます。

Java StAXパーサー-XMLドキュメントの解析

デモ例

解析する必要がある入力xmlファイルは次のとおりです-

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

StAXParserDemo.java

package com.finddevguides.xml;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

public class StAXParserDemo {
   public static void main(String[] args) {
      boolean bFirstName = false;
      boolean bLastName = false;
      boolean bNickName = false;
      boolean bMarks = false;

      try {
         XMLInputFactory factory = XMLInputFactory.newInstance();
         XMLEventReader eventReader =
         factory.createXMLEventReader(new FileReader("input.txt"));

         while(eventReader.hasNext()) {
            XMLEvent event = eventReader.nextEvent();

            switch(event.getEventType()) {

               case XMLStreamConstants.START_ELEMENT:
                  StartElement startElement = event.asStartElement();
                  String qName = startElement.getName().getLocalPart();

               if (qName.equalsIgnoreCase("student")) {
                  System.out.println("Start Element : student");
                  Iterator<Attribute> attributes = startElement.getAttributes();
                  String rollNo = attributes.next().getValue();
                  System.out.println("Roll No : " + rollNo);
               } else if (qName.equalsIgnoreCase("firstname")) {
                  bFirstName = true;
               } else if (qName.equalsIgnoreCase("lastname")) {
                  bLastName = true;
               } else if (qName.equalsIgnoreCase("nickname")) {
                  bNickName = true;
               }
               else if (qName.equalsIgnoreCase("marks")) {
                  bMarks = true;
               }
               break;

               case XMLStreamConstants.CHARACTERS:
                  Characters characters = event.asCharacters();
               if(bFirstName) {
                  System.out.println("First Name: " + characters.getData());
                  bFirstName = false;
               }
               if(bLastName) {
                  System.out.println("Last Name: " + characters.getData());
                  bLastName = false;
               }
               if(bNickName) {
                  System.out.println("Nick Name: " + characters.getData());
                  bNickName = false;
               }
               if(bMarks) {
                  System.out.println("Marks: " + characters.getData());
                  bMarks = false;
               }
               break;

               case XMLStreamConstants.END_ELEMENT:
                  EndElement endElement = event.asEndElement();

               if(endElement.getName().getLocalPart().equalsIgnoreCase("student")) {
                  System.out.println("End Element : student");
                  System.out.println();
               }
               break;
            }
         }
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (XMLStreamException e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

Start Element : student
Roll No : 393
First Name: dinkar
Last Name: kad
Nick Name: dinkar
Marks: 85
End Element : student

Start Element : student
Roll No : 493
First Name: Vaneet
Last Name: Gupta
Nick Name: vinni
Marks: 95
End Element : student

Start Element : student
Roll No : 593
First Name: jasvir
Last Name: singn
Nick Name: jazz
Marks: 90
End Element : student

Java StAXパーサー-XMLドキュメントのクエリ

デモ例

解析する必要がある入力xmlファイルは次のとおりです-

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

StAXParserDemo.java

package com.finddevguides.xml;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

public class StAXQueryDemo {
   public static void main(String[] args) {
      boolean bFirstName = false;
      boolean bLastName = false;
      boolean bNickName = false;
      boolean bMarks = false;
      boolean isRequestRollNo = false;

      try {
         XMLInputFactory factory = XMLInputFactory.newInstance();
         XMLEventReader eventReader =
         factory.createXMLEventReader(new FileReader("input.txt"));

         String requestedRollNo = "393";

         while(eventReader.hasNext()) {
            XMLEvent event = eventReader.nextEvent();

            switch(event.getEventType()) {
               case XMLStreamConstants.START_ELEMENT:
                  StartElement startElement = event.asStartElement();
                  String qName = startElement.getName().getLocalPart();

               if (qName.equalsIgnoreCase("student")) {
                  Iterator<Attribute> attributes = startElement.getAttributes();
                  String rollNo = attributes.next().getValue();

                  if(rollNo.equalsIgnoreCase(requestedRollNo)) {
                     System.out.println("Start Element : student");
                     System.out.println("Roll No : " + rollNo);
                     isRequestRollNo = true;
                  }
               } else if (qName.equalsIgnoreCase("firstname")) {
                  bFirstName = true;
               } else if (qName.equalsIgnoreCase("lastname")) {
                  bLastName = true;
               } else if (qName.equalsIgnoreCase("nickname")) {
                  bNickName = true;
               }
               else if (qName.equalsIgnoreCase("marks")) {
                  bMarks = true;
               }
               break;

               case XMLStreamConstants.CHARACTERS:
                  Characters characters = event.asCharacters();

               if(bFirstName && isRequestRollNo) {
                  System.out.println("First Name: " + characters.getData());
                  bFirstName = false;
               }
               if(bLastName && isRequestRollNo) {
                  System.out.println("Last Name: " + characters.getData());
                  bLastName = false;
               }
               if(bNickName && isRequestRollNo) {
                  System.out.println("Nick Name: " + characters.getData());
                  bNickName = false;
               }
               if(bMarks && isRequestRollNo) {
                  System.out.println("Marks: " + characters.getData());
                  bMarks = false;
               }
               break;

               case XMLStreamConstants.END_ELEMENT:
                  EndElement endElement = event.asEndElement();

               if(endElement.getName().getLocalPart().equalsIgnoreCase(
                  "student") && isRequestRollNo) {
                  System.out.println("End Element : student");
                  System.out.println();
                  isRequestRollNo = false;
               }
               break;
            }
         }
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (XMLStreamException e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

Start Element : student
Roll No : 393
First Name: dinkar
Last Name: kad
Nick Name: dinkar
Marks: 85
End Element : student

Java StAXパーサー-XMLドキュメントの作成

デモ例

ここに作成する必要があるXMLがあります-

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferrari 101</carname>
      <carname type = "sports">Ferrari 202</carname>
   </supercars>
</cars>

StAXCreateXMLDemo.java

package com.finddevguides.xml;

import java.io.IOException;
import java.io.StringWriter;

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

public class StAXCreateXMLDemo {

   public static void main(String[] args) {

      try {
         StringWriter stringWriter = new StringWriter();

         XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstance();
         XMLStreamWriter xMLStreamWriter =
            xMLOutputFactory.createXMLStreamWriter(stringWriter);

         xMLStreamWriter.writeStartDocument();
         xMLStreamWriter.writeStartElement("cars");

         xMLStreamWriter.writeStartElement("supercars");
         xMLStreamWriter.writeAttribute("company", "Ferrari");

         xMLStreamWriter.writeStartElement("carname");
         xMLStreamWriter.writeAttribute("type", "formula one");
         xMLStreamWriter.writeCharacters("Ferrari 101");
         xMLStreamWriter.writeEndElement();

         xMLStreamWriter.writeStartElement("carname");
         xMLStreamWriter.writeAttribute("type", "sports");
         xMLStreamWriter.writeCharacters("Ferrari 202");
         xMLStreamWriter.writeEndElement();

         xMLStreamWriter.writeEndElement();
         xMLStreamWriter.writeEndDocument();

         xMLStreamWriter.flush();
         xMLStreamWriter.close();

         String xmlString = stringWriter.getBuffer().toString();

         stringWriter.close();

         System.out.println(xmlString);

      } catch (XMLStreamException e) {
         e.printStackTrace();
      } catch (IOException e) {
        //TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferrari 101</carname>
      <carname type = "sports">Ferrari 202</carname>
   </supercars>
</cars>

Java StAXパーサー-XMLドキュメントの変更

デモ例

変更する必要があるXMLは次のとおりです-

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singh</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

StAXModifyDemo.java

package com.finddevguides.xml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class StAXModifyDemo {

   public static void main(String[] args) {

      try {
         XMLInputFactory factory = XMLInputFactory.newInstance();
         XMLEventReader eventReader = factory.createXMLEventReader(
            new FileReader("input.txt"));
         SAXBuilder saxBuilder = new SAXBuilder();
         Document document = saxBuilder.build(new File("input.txt"));
         Element rootElement = document.getRootElement();
         List<Element> studentElements = rootElement.getChildren("student");

         while(eventReader.hasNext()) {
            XMLEvent event = eventReader.nextEvent();

            switch(event.getEventType()) {
               case XMLStreamConstants.START_ELEMENT:
               StartElement startElement = event.asStartElement();
               String qName = startElement.getName().getLocalPart();

               if (qName.equalsIgnoreCase("student")) {
                  Iterator<Attribute> attributes = startElement.getAttributes();
                  String rollNo = attributes.next().getValue();

                  if(rollNo.equalsIgnoreCase("393")) {
                    //get the student with roll no 393

                     for(int i = 0;i < studentElements.size();i++) {
                        Element studentElement = studentElements.get(i);

                        if(studentElement.getAttribute(
                           "rollno").getValue().equalsIgnoreCase("393")) {
                           studentElement.removeChild("marks");
                           studentElement.addContent(new Element("marks").setText("80"));
                        }
                     }
                  }
               }
               break;
            }
         }
         XMLOutputter xmlOutput = new XMLOutputter();

        //display xml
         xmlOutput.setFormat(Format.getPrettyFormat());
         xmlOutput.output(document, System.out);
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (XMLStreamException e) {
         e.printStackTrace();
      } catch (JDOMException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

<?xml version = "1.0" encoding = "UTF-8"?>
<student rollno = "393">
   <firstname>dinkar</firstname>
   <lastname>kad</lastname>
   <nickname>dinkar</nickname>
   <marks>80</marks>
</student>
<student rollno = "493">
   <firstname>Vaneet</firstname>
   <lastname>Gupta</lastname>
   <nickname>vinni</nickname>
   <marks>95</marks>
</student>
<student rollno = "593">
   <firstname>jasvir</firstname>
   <lastname>singh</lastname>
   <nickname>jazz</nickname>
   <marks>90</marks>
</student>

Java XPathパーサー-概要

XPathは、World Wide Web Consortium(W3C)の公式勧告です。 XMLファイル内の情報を検索する言語を定義します。 XMLドキュメントの要素と属性をトラバースするために使用されます。 XPathは、XMLドキュメントから関連情報を照会するために使用できるさまざまなタイプの式を提供します。

XPathとは何ですか?

  • 構造の定義-XPathは、要素、属性、テキスト、名前空間、処理命令、コメント、ドキュメントノードなどのXMLドキュメントの部分を定義します。
  • Path Expressions -XPathは、XMLドキュメントの選択ノードまたはノードのリストなどの強力なパス式を提供します。
  • 標準関数-XPathは、文字列値、数値、日付と時刻の比較、ノードとQNameの操作、シーケンス操作、ブール値などの操作のための標準関数の豊富なライブラリを提供します。
  • * XSLTの主要部分*-XPathはXSLT標準の主要な要素の1つであり、XSLTドキュメントを操作するにはXPathの十分な知識が必要です。
  • * W3C勧告*-XPathはWorld Wide Web Consortium(W3C)の公式勧告です。

XPath式

XPathはパス式を使用して、XMLドキュメントからノードまたはノードのリストを選択します。 以下は、XMLドキュメントから任意のノード/ノードのリストを選択するための便利なパスと式のリストです。

Sr.No. Expression & Description
1

node-name

指定された名前「nodename」を持つすべてのノードを選択します

2

/

ルートノードから選択を開始

3

// //

選択は、選択に一致する現在のノードから開始されます

4

.

現在のノードを選択します

5

.. ..

現在のノードの親を選択します

6

@

属性を選択します

7

student

-「student」という名前のすべてのノードを選択します

8

class/student

-クラスの子であるすべての学生要素を選択する

9

//student

ドキュメント内のどこにいても、すべての学生要素を選択します

述語

述語は、特定のノードまたは特定の値を含むノードを見つけるために使用され、[…​]を使用して定義されます。

Expression Result
/class/student[1] Selects the first student element that is the child of the class element.
/class/student[last()] Selects the last student element that is the child of the class element.
/class/student[last()-1] Selects the last but one student element that is the child of the class element.
//student[@rollno = '493'] Selects all the student elements that have an attribute named rollno with a value of '493'

Java XPath Parser-XMLドキュメントの解析

XPathを使用する手順

以下は、XPathパーサーを使用してドキュメントを解析するときに使用される手順です。

  • XML関連のパッケージをインポートします。
  • DocumentBuilderを作成します。
  • ファイルまたはストリームからドキュメントを作成します。
  • XpathオブジェクトとXPathパス式を作成します。
  • * XPath.compile()を使用してXPath式をコンパイルし、 XPath.evaluate()*を介してコンパイルされた式を評価して、ノードのリストを取得します。
  • ノードのリストを反復処理します。
  • 属性を調べます。
  • サブ要素を調べます。

XML関連のパッケージをインポートする

import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import java.io.*;

DocumentBuilderを作成する

DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

ファイルまたはストリームからドキュメントを作成する

StringBuilder xmlStringBuilder = new StringBuilder();
xmlStringBuilder.append("<?xml version = "1.0"?> <class> </class>");
ByteArrayInputStream input =  new ByteArrayInputStream(
   xmlStringBuilder.toString().getBytes("UTF-8"));
Document doc = builder.parse(input);

XPathを構築する

XPath xPath =  XPathFactory.newInstance().newXPath();

パス式を準備して評価する

String expression = "/class/student";
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(
   doc, XPathConstants.NODESET);

NodeListを反復処理する

for (int i = 0; i < nodeList.getLength(); i++) {
   Node nNode = nodeList.item(i);
   ...
}

属性を調べる

//returns specific attribute
getAttribute("attributeName");

//returns a Map (table) of names/values
getAttributes();

サブ要素を調べる

//returns a list of subelements of specified name
getElementsByTagName("subelementName");

//returns a list of all child nodes
getChildNodes();

デモ例

これは、解析する必要がある入力テキストファイルです-

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singh</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

XPathParserDemo.java

package com.finddevguides.xml;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class XPathParserDemo {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.txt");
         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder;

         dBuilder = dbFactory.newDocumentBuilder();

         Document doc = dBuilder.parse(inputFile);
         doc.getDocumentElement().normalize();

         XPath xPath =  XPathFactory.newInstance().newXPath();

         String expression = "/class/student";
         NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(
            doc, XPathConstants.NODESET);

         for (int i = 0; i < nodeList.getLength(); i++) {
            Node nNode = nodeList.item(i);
            System.out.println("\nCurrent Element :" + nNode.getNodeName());

            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
               Element eElement = (Element) nNode;
               System.out.println("Student roll no :" + eElement.getAttribute("rollno"));
               System.out.println("First Name : "
                  + eElement
                  .getElementsByTagName("firstname")
                  .item(0)
                  .getTextContent());
               System.out.println("Last Name : "
                  + eElement
                  .getElementsByTagName("lastname")
                  .item(0)
                  .getTextContent());
               System.out.println("Nick Name : "
                  + eElement
                  .getElementsByTagName("nickname")
                  .item(0)
                  .getTextContent());
               System.out.println("Marks : "
                  + eElement
                  .getElementsByTagName("marks")
                  .item(0)
                  .getTextContent());
            }
         }
      } catch (ParserConfigurationException e) {
         e.printStackTrace();
      } catch (SAXException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (XPathExpressionException e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

Current Element :student
Student roll no : 393
First Name : dinkar
Last Name : kad
Nick Name : dinkar
Marks : 85

Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
Nick Name : vinni
Marks : 95

Current Element :student
Student roll no : 593
First Name : jasvir
Last Name : singh
Nick Name : jazz
Marks : 90

Java XPath Parser-XMLドキュメントのクエリ

デモ例

ここにクエリする必要がある入力テキストファイルがあります-

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

XPathParserDemo.java

package com.finddevguides.xml;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class XPathParserDemo {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.txt");
         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder;

         dBuilder = dbFactory.newDocumentBuilder();

         Document doc = dBuilder.parse(inputFile);
         doc.getDocumentElement().normalize();

         XPath xPath =  XPathFactory.newInstance().newXPath();

         String expression = "/class/student[@rollno = '493']";
         NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(
            doc, XPathConstants.NODESET);

         for (int i = 0; i < nodeList.getLength(); i++) {
            Node nNode = nodeList.item(i);
            System.out.println("\nCurrent Element :" + nNode.getNodeName());

            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
               Element eElement = (Element) nNode;
               System.out.println("Student roll no : "
                  + eElement.getAttribute("rollno"));
               System.out.println("First Name : "
                  + eElement
                  .getElementsByTagName("firstname")
                  .item(0)
                  .getTextContent());
               System.out.println("Last Name : "
                  + eElement
                  .getElementsByTagName("lastname")
                  .item(0)
                  .getTextContent());
               System.out.println("Nick Name : "
                  + eElement
                  .getElementsByTagName("nickname")
                  .item(0)
                  .getTextContent());
               System.out.println("Marks : "
                  + eElement
                  .getElementsByTagName("marks")
                  .item(0)
                  .getTextContent());
            }
         }
      } catch (ParserConfigurationException e) {
         e.printStackTrace();
      } catch (SAXException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (XPathExpressionException e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
Nick Name : vinni
Marks : 95

Java XPath Parser-XMLドキュメントの作成

  • XPathパーサーは、XMLドキュメントのみをナビゲートするために使用されます。 XMLの作成にはDOMパーサーを使用することをお勧めします。 同じことについては、Java DOM Parserセクションを参照してください。*

Java XPathパーサー-XMLドキュメントの変更

  • XPathパーサーは、XMLドキュメントのみをナビゲートするために使用されます。 XMLの変更にはDOMパーサーを使用することをお勧めします。 同じことについては、Java DOM Parserセクションを参照してください。*

Java DOM4Jパーサー-概要

DOM4Jは、XMLドキュメントを解析するためのオープンソースのJavaベースのライブラリです。 これは、柔軟性が高く、メモリ効率の高いAPIです。 Javaに最適化されており、リストや配列などのJavaコレクションを使用します。

DOM4Jは、DOM、SAX、XPath、およびXSLTで動作します。 非常に低いメモリフットプリントで大きなXMLドキュメントを解析できます。

環境設定

DOM4Jパーサーを使用するには、アプリケーションのクラスパスにdom4j-1.6.1.jarおよびjaxen.jarが必要です。 ダウンロードhttps://sourceforge.net/projects/dom4j/files/latest/download?source=files[dom4j-1.6.1.zip。]

使用する場合

次の場合は、DOM4Jパーサーを使用する必要があります-

  • XMLドキュメントの構造について多くを知る必要があります。
  • XMLドキュメントの一部を移動する必要があります(たとえば、特定の要素を並べ替えたい場合があります)。
  • XMLドキュメントの情報を複数回使用する必要があります。
  • あなたはJava開発者であり、XMLのJava最適化解析を活用したいと考えています。

あなたは何を得ますか?

DOM4JパーサーでXMLドキュメントを解析すると、アプリケーションのメモリフットプリントに影響を与えることなく、ドキュメントのすべての要素を含むツリー構造を取得する柔軟性が得られます。

DOM4Jは、ドキュメントが適切に構造化され、構造がわかっている場合に、XMLドキュメントの内容と構造を調べるために使用できるさまざまなユーティリティ関数を提供します。

DOM4Jは、XPath式を使用してXMLドキュメントをナビゲートします。

利点

DOM4Jは、Java開発者にXML解析コードの柔軟性と容易な保守性を提供します。 これは、軽量で迅速なAPIです。

DOM4Jクラス

DOM4JはいくつかのJavaクラスを定義します。 最も一般的なクラスは次のとおりです-

  • ドキュメント-XMLドキュメント全体を表します。 Documentオブジェクトは、多くの場合、DOMツリーと呼ばれます。
  • Element -XML要素を表します。 要素オブジェクトには、子要素、テキスト、属性、名前空間を操作するメソッドがあります。
  • 属性-要素の属性を表します。 属性には、属性の値を取得および設定するメソッドがあります。 親と属性タイプがあります。
  • Node -Element、Attribute、またはProcessingInstructionを表します。

一般的なDOM4Jメソッド

あなたがDOM4Jで作業しているとき、あなたが頻繁に使用するいくつかの方法があります-

  • * SAXReader.read(xmlSource)()*-XMLソースからDOM4Jドキュメントを構築します。
  • * Document.getRootElement()*-XMLドキュメントのルート要素を取得します。
  • * Element.node(index)*-要素内の特定のインデックスでXMLノードを取得します。
  • * Element.attributes()*-要素のすべての属性を取得します。
  • * Node.valueOf(@Name)*-要素の指定された名前を持つ属性の値を取得します。

Java DOM4Jパーサー-XMLドキュメントの解析

DOM4Jを使用する手順

以下は、DOM4Jパーサーを使用してドキュメントを解析するときに使用される手順です。

  • XML関連のパッケージをインポートします。
  • SAXReaderを作成します。
  • ファイルまたはストリームからドキュメントを作成します。
  • document.selectNodes()を呼び出して、XPath式を使用して必要なノードを取得します
  • ルート要素を抽出します。
  • ノードのリストを反復処理します。
  • 属性を調べます。
  • サブ要素を調べます。

XML関連のパッケージをインポートする

import java.io.*;
import java.util.*;
import org.dom4j.*;

DocumentBuilderを作成する

SAXBuilder saxBuilder = new SAXBuilder();

ファイルまたはストリームからドキュメントを作成する

File inputFile = new File("input.txt");
SAXBuilder saxBuilder = new SAXBuilder();
Document document = saxBuilder.build(inputFile);

ルート要素を抽出する

Element classElement = document.getRootElement();

属性を調べる

//returns specific attribute
valueOf("@attributeName");

サブ要素を調べる

//returns first child node
selectSingleNode("subelementName");

デモ例

解析する必要がある入力xmlファイルは次のとおりです-

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

DOM4JParserDemo.java

package com.finddevguides.xml;

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class DOM4JParserDemo {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.txt");
         SAXReader reader = new SAXReader();
         Document document = reader.read( inputFile );

         System.out.println("Root element :" + document.getRootElement().getName());

         Element classElement = document.getRootElement();

         List<Node> nodes = document.selectNodes("/class/student" );
         System.out.println("----------------------------");

         for (Node node : nodes) {
            System.out.println("\nCurrent Element :"
               + node.getName());
            System.out.println("Student roll no : "
               + node.valueOf("@rollno") );
            System.out.println("First Name : "
               + node.selectSingleNode("firstname").getText());
            System.out.println("Last Name : "
               + node.selectSingleNode("lastname").getText());
            System.out.println("First Name : "
               + node.selectSingleNode("nickname").getText());
            System.out.println("Marks : "
               + node.selectSingleNode("marks").getText());
         }
      } catch (DocumentException e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

Root element :class
----------------------------

Current Element :student
Student roll no :
First Name : dinkar
Last Name : kad
First Name : dinkar
Marks : 85

Current Element :student
Student roll no :
First Name : Vaneet
Last Name : Gupta
First Name : vinni
Marks : 95

Current Element :student
Student roll no :
First Name : jasvir
Last Name : singn
First Name : jazz
Marks : 90

Java DOM4Jパーサー-XMLドキュメントのクエリ

デモ例

解析する必要がある入力xmlファイルは次のとおりです-

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

DOM4JQueryDemo.java

package com.finddevguides.xml;

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class DOM4JQueryDemo {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.txt");
         SAXReader reader = new SAXReader();
         Document document = reader.read( inputFile );

         System.out.println("Root element :" + document.getRootElement().getName());

         Element classElement = document.getRootElement();

         List<Node> nodes = document.selectNodes("/class/student[@rollno = '493']" );
         System.out.println("----------------------------");

         for (Node node : nodes) {
            System.out.println("\nCurrent Element :"
               + node.getName());
            System.out.println("Student roll no : "
               + node.valueOf("@rollno") );
            System.out.println("First Name : "
               + node.selectSingleNode("firstname").getText());
            System.out.println("Last Name : "
               + node.selectSingleNode("lastname").getText());
            System.out.println("First Name : "
               + node.selectSingleNode("nickname").getText());
            System.out.println("Marks : "
               + node.selectSingleNode("marks").getText());
         }
      } catch (DocumentException e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

Root element :class
----------------------------
Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
First Name : vinni
Marks : 95

Java DOM4Jパーサー-XMLドキュメントの作成

デモ例

ここに作成する必要があるXMLがあります-

<?xml version = "1.0" encoding = "UTF-8"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferrari 101</carname>
      <carname type = "sports">Ferrari 202</carname>
   </supercars>
</cars>

CreateXmlFileDemo.java

package com.finddevguides.xml;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class DOM4JCreateXMLDemo {

   public static void main(String[] args) {

      try {
         Document document = DocumentHelper.createDocument();
         Element root = document.addElement( "cars" );
         Element supercarElement = root.addElement("supercars")
            .addAttribute("company", "Ferrai");

         supercarElement.addElement("carname")
            .addAttribute("type", "Ferrari 101")
            .addText("Ferrari 101");

         supercarElement.addElement("carname")
            .addAttribute("type", "sports")
            .addText("Ferrari 202");

        //Pretty print the document to System.out
         OutputFormat format = OutputFormat.createPrettyPrint();
         XMLWriter writer;
         writer = new XMLWriter( System.out, format );
         writer.write( document );
      } catch (UnsupportedEncodingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

<?xml version = "1.0" encoding = "UTF-8"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferrari 101</carname>
      <carname type = "sports">Ferrari 202</carname>
   </supercars>
</cars>

Java DOM4Jパーサー-XMLドキュメントの変更

デモ例

変更する必要があるXMLは次のとおりです-

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>

   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>

   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

DOM4jModifyXMLDemo.java

package com.finddevguides.xml;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class DOM4jModifyXMLDemo {

   public static void main(String[] args) {

      try {
         File inputFile = new File("input.txt");
         SAXReader reader = new SAXReader();
         Document document = reader.read( inputFile );

         Element classElement = document.getRootElement();

         List<Node> nodes = document.selectNodes("/class/student[@rollno = '493']" );

         for (Node node : nodes) {
            Element element = (Element)node;
            Iterator<Element> iterator = element.elementIterator("marks");

            while(iterator.hasNext()) {
               Element marksElement = (Element)iterator.next();
               marksElement.setText("80");
            }
         }

        //Pretty print the document to System.out
         OutputFormat format = OutputFormat.createPrettyPrint();
         XMLWriter writer;
         writer = new XMLWriter( System.out, format );
         writer.write( document );
      } catch (DocumentException e) {
         e.printStackTrace();
      } catch (UnsupportedEncodingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

これは、次の結果を生成します-

<?xml version = "1.0" encoding = "UTF-8"?>

<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>
   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>80</marks>
   </student>
   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

Java-xml-questions-answers