2017-11-11 67 views
1

我的XML(从调用Java中的PowerShell命令创建):我想显示名称,DisplayVersion和Publisher值到变量的Java:子节点值均为空

<?xml version="1.0" encoding="UTF-8"?> 
-<Objects> 
    -<Object> 
     <Property Name="DisplayName">Adobe AIR</Property> 
     <Property Name="DisplayVersion">27.0.0.124</Property> 
     <Property Name="Publisher">Adobe Systems Incorporated</Property> 
     <Property Name="InstallDate"/> 
    </Object> 

,但是我得到空值和#文本值由归国:

try { 

     DocumentBuilderFactory dBF = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dB = dBF.newDocumentBuilder(); 
     Document doc = dB.parse(new File(filename)); 

     NodeList nodeList = doc.getElementsByTagName("Object"); 

     for (int i = 0; i < nodeList.getLength(); i++) { 
      Node node = nodeList.item(i); 

      if (node.getNodeType() == Node.ELEMENT_NODE) { 
       Element e = (Element)node; 
       System.out.println("Node " + count.toString()); 

       NodeList childNodeList = e.getChildNodes(); 
       for (int j = 0; j < childNodeList.getLength() ; j++) { 
        Node childNode = childNodeList.item(j); 
        System.out.print("Child Node Type: " + childNode.getNodeType() + " - "); 
        System.out.print("Child Element Name: " + childNode.getNodeName() + " - "); 
        System.out.println("Element Value: " + childNode.getNodeValue()); 
       } 
       count++;  

      } 
     } 

此代码返回此输出存在于我的XML文件中的所有节点123:

Node 0 
Child Node Type: 3 - Child Element Name: #text - Element Value: 

Child Node Type: 1 - Child Element Name: Property - Element Value: null 
Child Node Type: 3 - Child Element Name: #text - Element Value: 

Child Node Type: 1 - Child Element Name: Property - Element Value: null 
Child Node Type: 3 - Child Element Name: #text - Element Value: 

Child Node Type: 1 - Child Element Name: Property - Element Value: null 
Child Node Type: 3 - Child Element Name: #text - Element Value: 

Child Node Type: 1 - Child Element Name: Property - Element Value: null 
Child Node Type: 3 - Child Element Name: #text - Element Value: 

我一直在寻找如何读取格式与我的格式一样的XML文件的例子,我真的很难与我非常有限的Java知识挣扎。任何帮助赞赏。

回答

0

你没有深入。

你只显示子节点本身和空白文本节点在它们之间,实际上并没有看子节点内的文本节点 - 即实际文本节点您有兴趣

在。你的内部循环,对于每个元素节点,你必须检索该节点的子节点,其中你会发现你正在寻找的文本

  for (int j = 0; j < childNodeList.getLength() ; j++) { 
       Node childNode = childNodeList.item(j); 
       NodeList subList = childNode.getChildNodes(); 
       for (int k = 0; k<subList.getLength(); k++) 
       { 
        etc... 
       } 
      } 
+0

谢谢你,吉姆加里森!虽然我的子节点名称仍然是'#text',但这些值仍在流动,这就是我需要通过这个过程来完成的一切。 –

+0

文本节点将_always_命名为'#text',这就是DOM的工作方式。查看[org.w3c.dom.Node](https://docs.oracle.com/javase/8/docs/api/org/w3c/dom/Node.html)顶部附近的表格,以查看不同节点类型的名称和值是。 –

+0

然后如何识别子节点名称?例如,知道我正在检索的值与DisplayName有关吗?如果我尝试使用getAttributes(),[即System.out.println(“Name:”+ subNode.getAttributes()。getNamedItem(“DisplayName”)。getNodeName()+“ - ”);]我得到一个运行时错误(NullPointerException)。 –