ホームページ >バックエンド開発 >XML/RSS チュートリアル >Java&Xml チュートリアル (6) JDOM を使用して XML ファイルを解析する

Java&Xml チュートリアル (6) JDOM を使用して XML ファイルを解析する

黄舟
黄舟オリジナル
2017-02-22 14:48:171693ブラウズ

JDOM は、XML ドキュメントの読み取り、変更、生成をより便利に行うための非常に優れた Java XML API を提供します。 JDOM は、ユーザーが SAX、DOM、STAX イベント解析、STAX ストリーム解析から特定の実装を選択できるラッパー クラスも提供します。

このチュートリアルでは、JDOM を使用して XML ファイル情報を読み取り、それを Java オブジェクトに変換する方法を学びます。
JDOM は標準の JDK の一部ではないため、JDOM を使用するには、公式 Web サイトから JDOM バイナリ パッケージをダウンロードし、JDOM Jar パッケージをプロジェクトのクラスパスに追加する必要があります。
JDOM は、基礎となる XML 解析 API を選択するためのラッパー クラスを提供します。これは、JDOM Document オブジェクトを取得するために使用できる 4 つの重要なクラスを提供します。 JDOM Document オブジェクトは、ルート要素、子要素のリスト、属性値などを取得するための非常に便利なメソッドを提供します。
JDOM の重要なクラス:
org.jdom2.input.DOMBuilder:DOM 解析メカニズムを使用して XML を解析し、JDOM Document オブジェクトに変換します。 org.jdom2.input.DOMBuilder:使用DOM解析机制解析XML并将它转换为JDOM Document对象。
org.jdom2.input.SAXBuilder:使用SAX解析机制解析XML并转换为JDOM Document。
org.jdom2.input.StAXEventBuilderorg.jdom2.input.StAXStreamBuilder作用和前面两个类似,不再赘述。
org.jdom2.DocumentJDOM Document对象提供有用的方法获取根元素,读取或修改元素内容等操作,我们将要使用它获取XML的根元素。
org.jdom2.Document提供了有用的方法来获取子元素集合,获取子元素值,获取属性值等操作。
接下来我们开始使用案例程序读取XML文件并生成Java对象。
employees.xml

<?xml version="1.0" encoding="UTF-8"?><Employees>
    <Employee id="1">
        <age>29</age>
        <name>Pankaj</name>
        <gender>Male</gender>
        <role>Java Developer</role>
    </Employee>
    <Employee id="2">
        <age>35</age>
        <name>Lisa</name>
        <gender>Female</gender>
        <role>CEO</role>
    </Employee>
    <Employee id="3">
        <age>40</age>
        <name>Tom</name>
        <gender>Male</gender>
        <role>Manager</role>
    </Employee></Employees>

该xml文件存放员工信息,我们使用Employee类表示员工。

package com.journaldev.xml;public class Employee {
    private int id;    
    private String name;    
    private String gender;    
    private int age;    
    private String role;    
    public int getId() {        
    return id;
    }    public void setId(int id) {        
    this.id = id;
    }    public String getName() {        
    return name;
    }    public void setName(String name) {        
    this.name = name;
    }    public String getGender() {        
    return gender;
    }    public void setGender(String gender) {        
    this.gender = gender;
    }    public int getAge() {        
    return age;
    }    public void setAge(int age) {        
    this.age = age;
    }    public String getRole() {        
    return role;
    }    public void setRole(String role) {        
    this.role = role;
    }    @Override
    public String toString() {        
    return "Employee:: ID="+this.id+" Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender + 
                   " Role=" + this.role;
    }

}

接着在测试程序中使用DOMBuilder读取XML文件生成Employee对象集合。
JDOMXMLReader.java

package com.journaldev.xml.jdom;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.DOMBuilder;
import org.jdom2.input.SAXBuilder;
import org.jdom2.input.StAXEventBuilder;
import org.jdom2.input.StAXStreamBuilder;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import com.journaldev.xml.Employee;
public class JDOMXMLReader {

    public static void main(String[] args) {
        final String fileName = "/Users/pankaj/employees.xml";
        org.jdom2.Document jdomDoc;
        try {
            //we can create JDOM Document from DOM, SAX and STAX Parser Builder classes
            jdomDoc = useDOMParser(fileName);
            Element root = jdomDoc.getRootElement();
            List<Element> empListElements = root.getChildren("Employee");
            List<Employee> empList = new ArrayList<>();
            for (Element empElement : empListElements) {
                Employee emp = new Employee();
                emp.setId(Integer.parseInt(empElement.getAttributeValue("id")));
                emp.setAge(Integer.parseInt(empElement.getChildText("age")));
                emp.setName(empElement.getChildText("name"));
                emp.setRole(empElement.getChildText("role"));
                emp.setGender(empElement.getChildText("gender"));
                empList.add(emp);
            }
            //lets print Employees list information
            for (Employee emp : empList)
                System.out.println(emp);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    //Get JDOM document from DOM Parser
    private static org.jdom2.Document useDOMParser(String fileName)
            throws ParserConfigurationException, SAXException, IOException {
        //creating DOM Document
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder;
        dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(new File(fileName));
        DOMBuilder domBuilder = new DOMBuilder();
        return domBuilder.build(doc);

    }
}

如你所见,这里我使用DOM解析包装类获取JDOM Document对象。
运行程序输出:

Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java DeveloperEmployee:: ID=2 
Name=Lisa Age=35 Gender=Female Role=CEOEmployee:: ID=3 Name=Tom Age=40 Gender=Male Role=Manager

我们同样可以使用SAX和STAX解析机制来完成,我们可以使用下面方法完成:

/Get JDOM document from SAX Parserprivate static org.jdom2.Document useSAXParser(String fileName) throws JDOMException,
        IOException {
    SAXBuilder saxBuilder = new SAXBuilder();    
    return saxBuilder.build(new File(fileName));
}
//Get JDOM Document from STAX Stream Parser or STAX Event Parserprivate static org.jdom2.
Document useSTAXParser(String fileName, String type) throws FileNotFoundException, XMLStreamException, JDOMException{    
if(type.equalsIgnoreCase("stream")){
        StAXStreamBuilder staxBuilder = new StAXStreamBuilder();
        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
        XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new FileInputStream(fileName));        
        return staxBuilder.build(xmlStreamReader);
    }
    StAXEventBuilder staxBuilder = new StAXEventBuilder();
    XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
    XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream(fileName));    
    return staxBuilder.build(xmlEventReader);

}

运行程序将会得到相同的输出,因为我们只是使用不同的包装类,但是获取的JDOM Document对象相同。
使用JDOM的好处是我们可以很方便的切换底层的解析机制而处理代码不发生改变。

JDOM 提供了非常优秀的Java XML API来更方便的读取、修改、生成XML文档。JDOM还提供了包装类供用户从SAX、DOM、STAX事件解析、STAX流解析中选择具体的实现。
在本教程中,我们一起学习使用JDOM將读取XML文件信息,并转换为Java对象。
JDOM并非标准JDK的一部分,因此使用JDOM需要从官方网站中下载JDOM的二进制包,下载后將JDOM的Jar包添加到工程的classpath中即可。
JDOM提供了包装类供我们选择底层的XML解析API,它提供了四个重要的类,我们可以使用它获取JDOM的Document对象。JDOM Document对象提供非常有用的方法来获取根元素,子元素列表,属性值等。
JDOM的重要的类:
org.jdom2.input.DOMBuilder:使用DOM解析机制解析XML并将它转换为JDOM Document对象。
org.jdom2.input.SAXBuilder:使用SAX解析机制解析XML并转换为JDOM Document。
org.jdom2.input.StAXEventBuilderorg.jdom2.input.StAXStreamBuilder作用和前面两个类似,不再赘述。
org.jdom2.DocumentJDOM Document对象提供有用的方法获取根元素,读取或修改元素内容等操作,我们将要使用它获取XML的根元素。
org.jdom2.Documentorg.jdom2.input.SAXBuilder:SAX 解析メカニズムを使用して XML を解析し、JDOM ドキュメントに変換します。
org.jdom2.input.StAXEventBuilderorg.jdom2.input.StAXStreamBuilder には、前の 2 つと同様の機能があるため、再度説明しません。
org.jdom2.DocumentJDOM Document オブジェクトは、ルート要素の取得、要素コンテンツの読み取りまたは変更などに便利なメソッドを提供します。これを使用して、XML のルート要素を取得します。

org.jdom2.Document は、子要素のコレクションの取得、子要素の値の取得、属性値の取得、およびその他の操作を行うための便利なメソッドを提供します。

次に、case プログラムを使用して XML ファイルを読み取り、Java オブジェクトを生成します。

employees.xml

<?xml version="1.0" encoding="UTF-8"?><Employees>
    <Employee id="1">
        <age>29</age>
        <name>Pankaj</name>
        <gender>Male</gender>
        <role>Java Developer</role>
    </Employee>
    <Employee id="2">
        <age>35</age>
        <name>Lisa</name>
        <gender>Female</gender>
        <role>CEO</role>
    </Employee>
    <Employee id="3">
        <age>40</age>
        <name>Tom</name>
        <gender>Male</gender>
        <role>Manager</role>
    </Employee></Employees>

この XML ファイルには、従業員情報を格納するために Employee クラスが使用されます。

package com.journaldev.xml;
public class Employee {
    private int id;    
    private String name;    
    private String gender;    
    private int age;    
    private String role;    
    public int getId() {        
    return id;
    }    public void setId(int id) {        
    this.id = id;
    }    public String getName() {        
    return name;
    }    public void setName(String name) {        
    this.name = name;
    }    public String getGender() {        
    return gender;
    }    public void setGender(String gender) {        
    this.gender = gender;
    }    public int getAge() {        
    return age;
    }    public void setAge(int age) {        
    this.age = age;
    }    public String getRole() {        
    return role;
    }    public void setRole(String role) {        
    this.role = role;
    }    @Override
    public String toString() {        
    return "Employee:: ID="+this.id+" Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender + 
                   " Role=" + this.role;
    }

}

次に、テスト プログラムで DOMBuilder を使用して XML ファイルを読み取り、Employee オブジェクトのコレクションを生成します。
JDOMXMLReader.java

package com.journaldev.xml.jdom;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.jdom2.Element;import org.jdom2.JDOMException;
import org.jdom2.input.DOMBuilder;
import org.jdom2.input.SAXBuilder;
import org.jdom2.input.StAXEventBuilder;
import org.jdom2.input.StAXStreamBuilder;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import com.journaldev.xml.Employee;
public class JDOMXMLReader {

    public static void main(String[] args) {
        final String fileName = "/Users/pankaj/employees.xml";
        org.jdom2.Document jdomDoc;
        try {
            //we can create JDOM Document from DOM, SAX and STAX Parser Builder classes
            jdomDoc = useDOMParser(fileName);
            Element root = jdomDoc.getRootElement();
            List<Element> empListElements = root.getChildren("Employee");
            List<Employee> empList = new ArrayList<>();
            for (Element empElement : empListElements) {
                Employee emp = new Employee();
                emp.setId(Integer.parseInt(empElement.getAttributeValue("id")));
                emp.setAge(Integer.parseInt(empElement.getChildText("age")));
                emp.setName(empElement.getChildText("name"));
                emp.setRole(empElement.getChildText("role"));
                emp.setGender(empElement.getChildText("gender"));
                empList.add(emp);
            }
            //lets print Employees list information
            for (Employee emp : empList)
                System.out.println(emp);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    //Get JDOM document from DOM Parser
    private static org.jdom2.Document useDOMParser(String fileName)
            throws ParserConfigurationException, SAXException, IOException {
        //creating DOM Document
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder;
        dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(new File(fileName));
        DOMBuilder domBuilder = new DOMBuilder();
        return domBuilder.build(doc);

    }
}

ご覧のとおり、ここでは DOM 解析ラッパー クラスを使用して JDOM Document オブジェクトを取得します。

プログラム出力を実行します:

Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java DeveloperEmployee:: 
ID=2 Name=Lisa Age=35 Gender=Female Role=CEOEmployee:: ID=3 Name=Tom Age=40 Gender=Male Role=Manager

SAX および STAX 解析メカニズムを使用して完了することもできます。次のメソッドを使用して完了することもできます:

/Get JDOM document from SAX Parserprivate static org.jdom2.Document useSAXParser(String fileName) throws JDOMException,
        IOException {
    SAXBuilder saxBuilder = new SAXBuilder();    return saxBuilder.build(new File(fileName));
}
//Get JDOM Document from STAX Stream Parser or STAX Event Parserprivate static org.jdom2.Document 
useSTAXParser(String fileName, String type) throws FileNotFoundException, XMLStreamException, JDOMException{    
if(type.equalsIgnoreCase("stream")){
        StAXStreamBuilder staxBuilder = new StAXStreamBuilder();
        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
        XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new FileInputStream(fileName));        
        return staxBuilder.build(xmlStreamReader);
    }
    StAXEventBuilder staxBuilder = new StAXEventBuilder();
    XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
    XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream(fileName));    
    return staxBuilder.build(xmlEventReader);

}

異なるラッパー クラスを使用しているだけなので、プログラムを実行すると同じ出力が得られます。 、ただし、JDOM Document オブジェクトと同じものを取得します。

JDOM を使用する利点は、処理コードを変更せずに、基礎となる解析メカニズムを簡単に切り替えることができることです。


JDOM は、XML ドキュメントの読み取り、変更、生成をより便利に行うための非常に優れた Java XML API を提供します。 JDOM は、ユーザーが SAX、DOM、STAX イベント解析、STAX ストリーム解析から特定の実装を選択できるラッパー クラスも提供します。

このチュートリアルでは、JDOM を使用して XML ファイル情報を読み取り、それを Java オブジェクトに変換する方法を学びます。 🎜JDOM は標準の JDK の一部ではないため、JDOM を使用するには、公式 Web サイトから JDOM バイナリ パッケージをダウンロードし、JDOM Jar パッケージをプロジェクトのクラスパスに追加する必要があります。 🎜JDOM は、基礎となる XML 解析 API を選択するためのラッパー クラスを提供します。これは、JDOM Document オブジェクトを取得するために使用できる 4 つの重要なクラスを提供します。 JDOM Document オブジェクトは、ルート要素、子要素のリスト、属性値などを取得するための非常に便利なメソッドを提供します。 🎜JDOM の重要なクラス: 🎜org.jdom2.input.DOMBuilder:DOM 解析メカニズムを使用して XML を解析し、JDOM Document オブジェクトに変換します。 🎜org.jdom2.input.SAXBuilder:SAX 解析メカニズムを使用して XML を解析し、JDOM ドキュメントに変換します。 🎜org.jdom2.input.StAXEventBuilderorg.jdom2.input.StAXStreamBuilder には、前の 2 つと同様の機能があるため、再度説明しません。 🎜org.jdom2.DocumentJDOM Document オブジェクトは、ルート要素の取得、要素コンテンツの読み取りまたは変更などに便利なメソッドを提供します。これを使用して、XML のルート要素を取得します。 🎜org.jdom2.Document は、子要素のコレクションの取得、子要素の値の取得、属性値の取得、およびその他の操作を行うための便利なメソッドを提供します。 🎜次に、case プログラムを使用して XML ファイルを読み取り、Java オブジェクトを生成します。 🎜employees.xml🎜rrreee🎜この XML ファイルには、従業員情報を格納するために Employee クラスが使用されます。 🎜rrreee🎜次に、テスト プログラムで DOMBuilder を使用して XML ファイルを読み取り、Employee オブジェクトのコレクションを生成します。 🎜JDOMXMLReader.java🎜rrreee🎜 ご覧のとおり、ここでは DOM 解析ラッパー クラスを使用して JDOM Document オブジェクトを取得します。 🎜プログラム出力を実行します:🎜rrreee🎜 SAX および STAX 解析メカニズムを使用して完了することもできます。次のメソッドを使用して完了することもできます:🎜rrreee🎜 異なるラッパー クラスを使用しているだけなので、プログラムを実行すると同じ出力が得られます。 、ただし、JDOM Document オブジェクトと同じものを取得します。 🎜 JDOM を使用する利点は、処理コードを変更せずに、基礎となる解析メカニズムを簡単に切り替えることができることです。 🎜🎜上記は、Java&Xml チュートリアル (6) JDOM を使用して XML ファイルを解析する内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。 🎜🎜🎜🎜
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。