【问题标题】:xpath getting value from childrenxpath 从孩子那里获得价值
【发布时间】:2012-08-04 16:52:51
【问题描述】:

如何从名字中获得兄弟姐妹?我不喜欢嵌套的。只有同一级别的。这怎么可能?

<root available-locales="en_US" default-locale="en_US">
    <dynamic-element instance-id="qk6m4eST" name="image" type="image" index-type="">
        <dynamic-element instance-id="fHkE2dfT" name="subimage" type="image" index-type="">
            <dynamic-element instance-id="jbthDbC4" name="x" type="text" index-type="">
               <dynamic-content>23</dynamic-content>
            </dynamic-element>
            <dynamic-element instance-id="Rb3qRF6N" name="y" type="text" index-type="">
                <dynamic-content>32</dynamic-content>
            </dynamic-element>
            <dynamic-content><![CDATA[C:\fakepath\images (1).jpeg]]></dynamic-content>
        </dynamic-element>
        <dynamic-content><![CDATA[C:\fakepath\images (1).jpeg]]></dynamic-content>
    </dynamic-element>
    <dynamic-element instance-id="MFrJW4OR" name="image" type="image" index-type="">
        <dynamic-element instance-id="hjKEtVB6" name="subimage" type="image" index-type="">
            <dynamic-element instance-id="NrY9iZ4K" name="x" type="text" index-type="">
                <dynamic-content>23</dynamic-content>
            </dynamic-element>
            <dynamic-element instance-id="7lG7RuAC" name="y" type="text" index-type="">
                <dynamic-content>32</dynamic-content>
            </dynamic-element>
            <dynamic-content><![CDATA[C:\fakepath\grillat.jpeg]]></dynamic-content>
        </dynamic-element>
        <dynamic-content><![CDATA[C:\fakepath\images (1).jpeg]]></dynamic-content>
    </dynamic-element>
</root>

到目前为止,这是我的代码。它打印

测试...... 23

这是第一个嵌套子元素的值。 23

public List<PopupImage> getImageNodes(Document document) {
    List<Node> nodes = document.selectNodes("/root/dynamic-element[@name='" + IMAGE_NODE_NAME + "']");

    List<PopupImage> popupImages = new ArrayList<PopupImage>();
    for (Node node : nodes) {
        // node.selectSingleNode("//following-sibling::dynamic-content[1]").getText();
        System.out.println("test...... " + node.selectSingleNode("//following-sibling::dynamic-content").getText());
        createPopupImage(node);
        popupImages.add(createPopupImage(node));
    }
    return popupImages;
}

编辑:我需要每个图像节点和其中的动态值的值。

<root>
    <dynamic-element name=image>
         <dynamic-element name=subimage/>
         <dynamic-content>content1</dynamic-content> 
    </dynamic-element>  

     <dynamic-element name=image>
         <dynamic-element name=subimage/>
         <dynamic-content>content2</dynamic-content>  
    </dynamic-element> 
</root>

编辑2:

澄清更多。我需要将每个图像节点与其中的动态内容配对。

【问题讨论】:

  • 你读过spec on the available axes,尤其是following-sibling轴吗?
  • 我尝试了以下兄弟,但它也给了我嵌套的。我只需要同一级别的。不过我会读的。到目前为止,我只使用谷歌作为示例。
  • following-sibling 不应该给你嵌套的。您能否扩展您的问题以显示到目前为止您正在做的更多事情?即您选择了文档的哪一部分,并基于此,您使用了带有following-sibling 的 XPath 来获取兄弟姐妹?
  • 好的,我想我看到了问题,但在写答案之前,我想声明我无法完全重现您的代码的行为。很可能我使用的 Xml 引擎与您使用的不同,但我看不出 &lt;dynamic-content&gt;23&lt;/dynamic-content&gt; 如何可能被 following-sibling::dynamic-content XPath 表达式选择,因为它显然不是任何其他元素的兄弟。您向我们展示的作为源 Xml 文档的内容是否完整,或者实际上是否有任何其他元素? (没关系;我只是想知道我是否遗漏了什么)
  • 此外,如果您正在寻找“当前”元素的同级(似乎是&lt;dynamic-element&gt;),则同级在您的 Xml 文档中也将是 &lt;dynamic-element&gt;,而不是&lt;dynamic-content&gt; 就像您尝试在代码中选择的内容一样,对吧?

标签: xml xpath xml-parsing


【解决方案1】:

使用

/*/dynamic-element[@name='image'][1]/dynamic-content

这会选择任何dynamic-content 的子元素dynamic-element,它是顶部元素的第一个dynamic-element 子元素,并且其name 属性的字符串值是字符串"image"

还有这个 XPath 表达式

/*/dynamic-element[@name='image']/dynamic-content

选择

<dynamic-content>C:\fakepath\images (1).jpeg</dynamic-content>
<dynamic-content>C:\fakepath\images (1).jpeg</dynamic-content>

如果您只需要文本节点,请使用

/*/dynamic-element[@name='image']/dynamic-content/text()

这会选择上一个表达式选择的元素的以下两个文本节点子节点:

C:\fakepath\images (1).jpeg
C:\fakepath\images (1).jpeg

您可以通过迭代返回的XmlNodeList 并获取其中包含的每个XmlNode 对象的值来获取所选节点的值。

【讨论】:

  • 谢谢,但我需要这个元素
  • @user874774:是的,你的问题中没有这个,所以我猜——请你编辑问题并指定应该选择的节点是什么?
  • @user874774:你想要的不能仅仅通过评估一个 XPath 表达式来完成——XPath 是一种用于 XML 文档的 query 语言——因此它不会修改 (插入/删除) XML 文档的节点。我很快就会给你一个 XSLT 解决方案。
  • 什么意思?它似乎工作。我只想查询值。不修改任何东西。还是谢谢你。
  • @user874774:完成。在您的编辑中,您说您要生成一个新文档 - 并指定确切的所需文档。此转换应用于提供的 XML 文档,并从中生成所需的 XML 文档。
【解决方案2】:

目前,在选择 &lt;dynamic-element&gt; 元素后,您运行以下 XPath:

//following-sibling::dynamic-content

让我们看看这意味着什么:

  • //:回到文档根目录并考虑所有节点,嵌套在任何级别。
  • following-sibling:::查找与前一个节点同级的节点(即在相同的嵌套级别和相同的父节点)。
  • dynamic-content:这个兄弟节点必须是 &lt;dynamic-content&gt; 元素。

这不是您想要的,如您的文本中所述。

相反,您希望找到当前节点的下一个兄弟节点。该兄弟将是一个&lt;dynamic-element&gt; 元素。在该兄弟节点中,您希望找到一个子节点,即 &lt;dynamic-content&gt; 元素。

因此,请在您的 node.selectSingleNode 调用中尝试此 XPath:

following-sibling::dynamic-element/dynamic-content

【讨论】:

  • 奇怪。它工作一次迭代。第二个“图像”抛出一个空指针。
  • @user874774:那么,第二张图片的名称是什么?
  • 应该是同一个第一个迭代节点......org.dom4j.tree.DefaultElement@6d9e9816 [元素:]文本...... .c:\fakepath\images (1).jpeg路径...... /root/dynamic-element/dynamic-content 第二次迭代节点...... null
  • 两个节点应该相同。
  • @user874774:IMAGE_NODE_NAME 是什么?是image吗?
猜你喜欢
  • 1970-01-01
  • 2020-06-17
  • 2015-07-18
  • 1970-01-01
  • 2018-09-22
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多