java - XML Java 读取 Node?

标签 java xml nodes

这是我第一次必须在 Java 中处理 XML 文件。

我有一个简单的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<ItemList>
        <Item id="1">
            <Clothes>
                <element1>Test Cloth</element1>
                <element2>1</element2>
                <element3>true</element3>
                <element4>1</element4>
                <element5>100</element5>
                <element6>4</element6>
                <element7>false</element7>
            </Clothes>
        </Item>
</ItemList>

Java:

InputStream is = ItemsLoader.class.getResourceAsStream("ItemList.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);

doc.getDocumentElement().normalize();

NodeList nList = doc.getElementsByTagName("Item");

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

    Element eItemElement = (Element)nNode;
    Node elementNode = eItemElement.getFirstChild();

    System.out.println("Item Node name: " + nNode.getNodeName());
    System.out.println("Element Node name: " + elementNode.getNodeName());

}

我的输出是:

项目

文本#

为什么获取不到子节点? Item 的子节点应该是 'Clothes'..

感谢支持!

最佳答案

<item>元素有一个个 child Node :

<Item id="1"><Clothes>...</Clothes></Item>

另一个有三个。其中两个是不可见的:

<Item id="1">
     <Clothes>...</Clothes> 
</Item>

此处显示了不可见节点(我将它们替换为 [#...#] ):

<Item id="1">[#
#####]<Clothes>...</Clothes>[#]
</Item>

它们是文本节点 ( Text ),它们包含所有空白字符,直到下一个不同类型的节点。当您使用诸如 getFirstChild() 之类的方法时返回 Node , 你会得到第一个 Node无论它的类型是什么。您不能总是假定它是一个元素,除非您在解析源文档时已将元素之间的所有空格分隔开。它仍然可能不是文档 Comment节点和 Processing Instruction节点也算作 child 。

访问子元素节点的安全方法是测试该节点是否真的是一个元素。您可以比较节点类型,您可以通过 getNodeType() 获得Node 中的方法和常量表示节点类型的接口(interface)并跳过不是元素的节点。

if(node.getNodeType() == Node.ELEMENT_NODE) { 
    // this is an element!
    Element myElement = (Node)node;
}

您还可以使用其他 API,例如 DOM4J 或 JDOM,它们包括返回子元素的额外方法、标准 XPath API,您可以在其中获取元素的 NodeList 作为结果,或者标准 DOM 方法,例如 getElementsByTagName您可以从您的上下文元素引用中调用它,并从您的子树中获取所有后代元素

在您的程序中,您可以检索 Clothes通过在 getChildNodes() 上迭代提取元素节点节点列表并获取节点类型与 Node.ELEMENT_NODE 匹配的第一个节点.

关于java - XML Java 读取 Node?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23896021/

相关文章:

java - 启动后更改Spring Cloud Config服务器uri

java - 如何使用多线程聚合两个 Web 服务?

java - 指针引用和操作所指向的对象 - Java 中的等效结构

java - Android Wear 应用程序在注册传感器监听器时崩溃

c++ - 图的节点类(C++)

swift - 返回 GameScene 后 SpriteNodes 搞砸了 (Swift)

javascript - 带有 XML 调用的 CORS 发布索引文件

java - EclipseLink MOXy 是否适合大得离谱的 XML 文件?

.net - 反序列化 XML 时忽略指定的编码

java - Node<E> 在此链表 Java 示例代码中代表什么?