2

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

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

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

4

2 回答 2

1

使用

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

这将选择任何dynamic-content作为顶部元素dynamic-element的第一dynamic-element个子元素的子元素,并且其name属性的字符串值为 string "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对象的值来获取所选节点的值。

于 2012-08-04T18:12:12.703 回答
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
于 2012-08-04T17:36:52.010 回答