2012-01-12 60 views
2

我很难从使用XPath的XML文件获取XML值。 XML文件有以下模式:使用XPath检索XML元素

<devicesInfo> 
    <deviceInfo> 
    <deviceId>device1</deviceId> 
    <macAddress>00:21:85:C9:19:A4</macAddress> 
    <deviceType>deviceType1</deviceType> 
    <deviceClass>/Server/SSH/Linux/</deviceClass> 
    <location>location1</location> 
    <productionState>Decommissioned</productionState> 
</deviceInfo> 
<deviceInfo> 
    <deviceId>device2</deviceId> 
    <macAddress>00:21:85:C9:19:F5</macAddress> 
    <deviceType>deviceType1</deviceType> 
    <deviceClass>/Server/SSH/Linux/</deviceClass> 
    <location>location1</location> 
    <productionState>Decommissioned</productionState> 
</deviceInfo> 
</devicesInfo> 

我试图做的是首先创建一个自定义的类的实例,把我所造的,其中包含了以下方法:

public NodeList getNodesList(String xmlQuery) throws XPathExpressionException { 
     NodeList nodes = null; 
     try { 
      nodes = (NodeList) xPath.evaluate(xmlQuery, doc, XPathConstants.NODESET); 
     } catch (XPathExpressionException ex) { 
      throw ex; 
     } 
     return nodes; 

    } 

然后,此方法被调用查询:

NodeList nodes = xmlHandler.getNodesList("/devicesInfo/deviceInfo"); 

到目前为止好,因为这是返回节点列表长度为2,这基本上是人l文件中的deviceInfo元素。 接下来我要做的是遍历每个deviceInfo以获取其子元素(deviceId,macAddress,deviceType,deviceClass,location,productionState)的值。

我试着做到以下几点: NodeList list = nodes.item(0).getChildNodes();

然后

System.out.println("First element is "+list.item(0).getTextContent()); 

这给了我一个空字符串。虽然当我尝试这样做:

System.out.println("First element is "+list.item(1).getTextContent()); 

它基本上显示与索引“1”的项目,而不是项目与索引“0”,这结束了打印“DEVICE1”,这是第一个元素的值。

所以为了得到所有元素的值,我会使用1,3,5,7,9,11的索引。我知道我做错了什么。任何人都可以帮助我吗?

+0

'list'和'children'和'nodes'之间的关系是什么? – 2012-01-12 18:35:26

+0

这是一个错字。儿童实际上是“名单”。 – 2012-01-12 18:49:44

回答

2

<deviceInfo>元素的子元素包含多个仅包含空白的文本节点。您需要将其过滤出来,以便您只遍历作为元素的子元素,或者在<deviceInfo>元素内仅包含空格的文本节点为ignored的模式下解析XML。

+0

哇!谢谢!这已经解决了我的问题! 我已经创建了一个生成此XML文件的进程。我能以某种方式仍然在该过程中格式化XML文件,而不必担心我上面描述的问题? – 2012-01-12 18:44:06

+0

@MouhammedSoueidane,我相信有一些方法可以使用XML模式来指定哪些元素可以忽略空格。如果你不使用这些验证,那么我认为你最好的选择是首先删除可忽略的空白,可能是通过编写一个xpath查询来匹配所有不包含非空格字符的文本节点。我不会让你的XML难以通过不需要空白节点进行调试。 – 2012-01-12 18:55:40

+0

现在我知道问题出在哪里,这帮助我解决了这个问题: http://stackoverflow.com/questions/229310/how-to-ignore-whitespace-while-reading-a-file-to-produce- an-xml-dom 非常感谢你,你是一个拯救生命的人。 – 2012-01-12 19:09:07