Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用domapi访问XML节点的值_Java_Xml_Parsing_Dom - Fatal编程技术网

Java 如何使用domapi访问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

我试图用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>
但当我使用

            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");