gpt4 book ai didi

java - 如何使用 DOM API 访问 XML 节点的值

转载 作者:行者123 更新时间:2023-11-30 11:19:48 25 4
gpt4 key购买 nike

我正在尝试使用 Dom 解析器访问 XML 文档中的某些值,但我收到了一个奇怪的空指针异常错误。我使用的代码是:

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

public class readXML {

public static void main(String[] args) {
File file = new File("C:\\Users\\manolaki\\Desktop\\assets.xml");
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(file);
doc.getDocumentElement().normalize();

Node node = doc.getElementsByTagName("assets").item(0).getChildNodes().item(1).getChildNodes().item(1).getAttributes().getNamedItem("src");

String boo = node.getNodeValue();

System.out.println("Name is " + boo);

}
catch (Exception e) {
e.printStackTrace();
}
}
}

我正在使用的 xml:

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

<assets>
<sprite>
<img src="menu.png"/>
</sprite>
<sprite>
<img src="background.png"/>
</sprite>
<sprite>
<img src="buttons.png"/>
</sprite>
<sprite>
<img src="animals.png"/>
</sprite>
<sprite>
<img src="cycles.png"/>
</sprite>
<sprite>
<img src="texts.mp3"/>
</sprite>
<sprite>
<img src="music.mp3"/>
</sprite>
<sprite>
<img src="click.mp3"/>
</sprite>
<sprite>
<img src="swipe.mp3"/>
</sprite>
<sprite>
<img src="dog.mp3"/>
</sprite>
</assets>

<assets>
<sprite>
<img src="mehnu.png"/>
</sprite>
<sprite>
<img src="background.png"/>
</sprite>
<sprite>
<img src="buttons.png"/>
</sprite>
<sprite>
<img src="animals.png"/>
</sprite>
<sprite>
<img src="cycles.png"/>
</sprite>
<sprite>
<img src="texts.mp3"/>
</sprite>
<sprite>
<img src="music.mp3"/>
</sprite>
<sprite>
<img src="click.mp3"/>
</sprite>
<sprite>
<img src="swipe.mp3"/>
</sprite>
<sprite>
<img src="dog.mp3"/>
</sprite>
</assets>

</xml>

代码按原样运行良好,并在控制台打印出“menu.png”。问题是,虽然我可以使用第一个“Item()”部分浏览 Assets 节点,但如果我尝试更改第二个“item()”以浏览 Sprite ,它会打印一个空指针异常错误。例如,如果我使用它就可以工作:

                Node node = doc.getElementsByTagName("assets").item(1).getChildNodes().item(1).getChildNodes().item(1).getAttributes().getNamedItem("src");

但我用的时候不是

            Node node = doc.getElementsByTagName("assets").item(0).getChildNodes().item(2).getChildNodes().item(1).getAttributes().getNamedItem("src");

我认为这有点奇怪.. 考虑到 eclipse 没有发现任何错误。任何帮助,将不胜感激。谢谢

最佳答案

你的问题是 NodeList 的 item(0) 是一个文本节点,而文本节点没有子节点,这就是你的 NullPointerException 被抛出的地方。

尝试将此添加到您的代码中以验证:

Node child0 = doc.getElementsByTagName("assets").item(0).getChildNodes().item(0);
if (child0.getNodeType() == Node.TEXT_NODE) {
System.out.println("child node is text");
}

所以请记住,在遍历 NodeList 时需要检查每个节点的类型。

在您的情况下,奇数子节点是文本节点,偶数子节点是元素。试试这个:

NodeList nodes = doc.getElementsByTagName("assets").item(0).getChildNodes();
for ( int x = 0; x < nodes.getLength(); x++ ) {
Node node = nodes.item(x);
if (node.getNodeType() == Node.TEXT_NODE) {
System.out.println(x + " text");
} else if (node.getNodeType() == Node.ELEMENT_NODE) {
String nodeName = node.getNodeName();

System.out.println(x + " Node: " + nodeName);
}
}

输出:

0 text
1 Node: sprite
2 text
3 Node: sprite
4 text
5 Node: sprite
...

您可能想查看 this article来自 Dobb 博士,其中有一些很好的示例代码,您可以从中创建一些像这样的低级 DOM 解析的便捷方法。

关于java - 如何使用 DOM API 访问 XML 节点的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23059620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com