【问题标题】:Retrieve XML Elements with XPath使用 XPath 检索 XML 元素
【发布时间】:2012-01-12 18:31:46
【问题描述】:

我很难使用 XPath 从 XML 文件中获取 XML 值。 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 的 NodeList,它基本上是文件中的所有 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。我知道我做错了什么。谁能帮帮我?

【问题讨论】:

  • listchildrennodes是什么关系?
  • 那是一个错字。 Children实际上是“列表”。

标签: java xml xpath


【解决方案1】:

&lt;deviceInfo&gt; 元素的子元素包括许多纯空白文本节点。您需要将它们过滤掉,以便仅迭代作为元素的子元素,或者以 &lt;deviceInfo&gt; 元素内的纯空白文本节点为 ignored 的模式解析 XML。

【讨论】:

  • 哇,非常感谢!这解决了我的问题!我创建了一个生成此 XML 文件的进程。我可以在那个过程中以某种方式格式化 XML 文件,而不必担心我上面描述的问题吗?
  • @MouhammedSoueidane,我相信有一些方法可以使用 XML 模式来指定哪些元素中的空格可以忽略。如果您不使用这些进行验证,那么我认为您最好的选择是首先删除可忽略的空格,也许通过制作一个 xpath 查询来匹配所有不包含非空格字符的文本节点。我不会因为不需要空白节点而使您的 XML 更难调试。
  • 现在我知道问题出在哪里,这帮助我解决了它:stackoverflow.com/questions/229310/… 非常感谢,你救了我的命。
  • @MouhammedSoueidane,不客气。祝你的项目好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多