Java 如何使用domapi访问XML节点的值
我试图用Dom解析器访问XML文档中的一些值,但遇到了一个奇怪的空指针异常错误。 我使用的代码是:Java 如何使用domapi访问XML节点的值,java,xml,parsing,dom,Java,Xml,Parsing,Dom,我试图用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 cl
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>
但当我使用
Node node = doc.getElementsByTagName("assets").item(0).getChildNodes().item(2).getChildNodes().item(1).getAttributes().getNamedItem("src");
我觉得有点奇怪。。假设eclipse没有发现任何错误。
任何帮助都将不胜感激。谢谢您的问题是NodeList的项(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 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);
}
}
您可能想从Dobb博士的网站上查看,该网站有一些很好的示例代码,您可以从这些代码中创建一些方便的方法,用于像这样的低级DOM解析。更简单的API检查。使用DOM:
String src = Xsylum.elementFor(xmlFile).get("sprite").get("img").attribute("src");
或者使用XPath:
String src = Xsylum.elementFor(xmlFile).value("//sprite[1]/img/@src");
getElementsByTagName(“资产”)中存在mb问题。项(0)?尝试使用项(1)而不是项(0)将链接调用拆分为几行,以查看哪个方法调用实际触发NPEI。我刚刚注意到它只适用于奇数。。例如,项目(1)prints menu.png,项目(3)prints“background.png,项目(5)prints”buttons.png“等。当我使用偶数2、4、6等时,它会打印NPE错误。”。。知道为什么吗?好的,这就用奇数解开了谜团。事实证明,当我使用偶数时,我得到一个文本节点,而使用奇数时,我得到实际节点。我不知道为什么它会这样,但至少我现在明白了,并且可以解决这个问题。我还将查看这篇文章以获得更多的见解。感谢这是因为xml格式中有空格。如果要去掉节点之间多余的空白,那么奇数项和偶数项上都会有元素。所以不要只依赖奇数对偶数!现在这真的很有用!它很好用,再次非常感谢!
String src = Xsylum.elementFor(xmlFile).get("sprite").get("img").attribute("src");
String src = Xsylum.elementFor(xmlFile).value("//sprite[1]/img/@src");