Java获取XML格式节点

引言

XML(eXtensible Markup Language)是一种常用的表示和传输数据的标记语言。在Java开发中,我们经常需要读取和操作XML文件。本文将介绍Java中获取XML格式节点的方法,并附带代码示例。

XML基本结构

XML文档由元素(element)、属性(attribute)、文本(text)和注释(comment)组成。下面是一个简单的XML示例:

<bookstore>
    <book category="children">
        <title>Harry Potter</title>
        <author>J.K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
    <book category="web">
        <title>Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
    </book>
</bookstore>

在这个示例中,bookstore是根元素,book是子元素。book元素有一个category属性,以及若干子元素(titleauthoryearprice)。我们的目标是使用Java代码获取这些节点的值。

使用DOM解析器

DOM(Document Object Model)是一种以树状结构表示XML文档的标准,Java提供了DOM解析器来解析和操作XML文档。

首先,我们需要创建一个DOM解析器对象:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;

public class XMLParser {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse("books.xml");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上代码创建了一个DocumentBuilderFactory对象和一个DocumentBuilder对象,然后使用parse方法将XML文件解析为一个Document对象。需要注意的是,我们需要捕获可能抛出的异常。

接下来,我们可以使用Document对象获取节点的值。下面是一些常用的方法:

  • getElementsByTagName:根据元素名称获取节点列表;
  • getAttribute:获取属性的值;
  • getTextContent:获取文本节点的值。
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;

public class XMLParser {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse("books.xml");

            NodeList bookList = document.getElementsByTagName("book");
            for (int i = 0; i < bookList.getLength(); i++) {
                Node bookNode = bookList.item(i);
                if (bookNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element bookElement = (Element) bookNode;

                    String category = bookElement.getAttribute("category");
                    String title = bookElement.getElementsByTagName("title").item(0).getTextContent();
                    String author = bookElement.getElementsByTagName("author").item(0).getTextContent();
                    int year = Integer.parseInt(bookElement.getElementsByTagName("year").item(0).getTextContent());
                    double price = Double.parseDouble(bookElement.getElementsByTagName("price").item(0).getTextContent());

                    System.out.println("Category: " + category);
                    System.out.println("Title: " + title);
                    System.out.println("Author: " + author);
                    System.out.println("Year: " + year);
                    System.out.println("Price: " + price);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上代码通过getElementsByTagName方法获取book元素的节点列表,并使用getAttributegetTextContent方法获取属性和文本节点的值。需要注意的是,节点列表是从0开始索引的。

使用XPath表达式

XPath是一种使用路径表达式在XML文档中进行导航和查询的语言。Java提供了XPath解析器来执行XPath表达式。

首先,我们需要创建一个XPath解析器对象:

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;

public class XMLParser {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse("books.xml");

            XPathFactory xPathFactory = XPathFactory.newInstance();
            XPath xPath = xPathFactory.newXPath();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}