xpath从孩子那里获得价值

时间:2012-08-04 16:52:51

标签: xml xpath xml-parsing

从一个名字我怎么得到sibbling?我不会嵌套的。只有同一级别的人。这怎么可能?

<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>

EDIT2:

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

2 个答案:

答案 0 :(得分: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对象的值来获取所选节点的值。

答案 1 :(得分:0)

目前,在选择<dynamic-element>元素后,运行以下XPath:

//following-sibling::dynamic-content

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

  • //:移回文档根目录并考虑嵌套在任何级别的所有节点。
  • following-sibling:::找到一个节点,它是前一个节点的兄弟节点(即在相同的嵌套级别上,并且具有相同的父节点)。
  • dynamic-content:此兄弟节点必须是<dynamic-content>元素。

这不是您想要的内容。

相反,您希望找到当前节点的以下兄弟。那个兄弟姐妹将成为<dynamic-element>元素。在那个兄弟中,你想要找到一个子节点,即<dynamic-content>元素。

因此,请在node.selectSingleNode电话中尝试此XPath:

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