2012-08-04 80 views
2

从一个名字我如何得到s??我不会不会嵌套的。只有在同一级别的那个。这怎么可能?xpath从儿童中获得价值

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

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

+0

您是否阅读过[可用轴上的spec](http://www.w3.org/TR/xpath/#axes),特别是在“after-sibling”轴上? – 2012-08-04 16:54:49

+0

我试过下面的兄弟姐妹,但它也给我嵌套的。我只需要一个在同一水平上的人。但我会阅读。到目前为止,我只使用过谷歌。 – pethel 2012-08-04 17:05:45

+0

'以下兄弟姐妹'不应该给你嵌套的。你能否扩展你的问题以更多地展示你到目前为止所做的事情;即您选择哪部分文档,并基于此,您使用过哪些带有“follow-sibling”的XPath来获取兄弟姐妹? – 2012-08-04 17:07:51

回答

1

使用

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

这将选择任何dynamic-content这是dynamic-element是第一dynamic-element孩子的孩子顶部元素,其属性的字符串值为字符串"image"

而这个XPath表达式

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

选择

​​

如果你只想文本节点,使用

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

此选择由前面的表达式中选择的元素的以下两个文本子节点:

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

可以通过迭代对返回XmlNodeList并获得包含在每个XmlNode对象的值获得所选择的节点的值那里。

+0

谢谢,但我需要这个元素<![CDATA [C:\ fakepath \ images(1).jpeg]]> pethel 2012-08-04 18:21:40

+0

@ user874774:是的, ,所以我猜测 - 请问你可以编辑这个问题,并在那里指定应该选择哪个节点? – 2012-08-04 18:24:21

+0

请参阅编辑 – pethel 2012-08-04 18:31:07

0

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

//following-sibling::dynamic-content 

让我们来看看这是什么意思:

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

这不是你想要的,正如你在文中所描述的那样。

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

因此,试试这个XPath在node.selectSingleNode电话:

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

奇怪。它工作一次迭代。第二个“图像”抛出一个空指针。 – pethel 2012-08-04 17:51:38

+0

@ user874774:那么,第二个图像的名称是什么? – 2012-08-04 17:54:13

+0

应该与第一次迭代相同 节点...... [email protected] [元素:] text ...... C:\ fakepath \ images(1).jpeg 路径....../root/dynamic-element/dynamic-content 第二次迭代 node .... null – pethel 2012-08-04 17:56:46