【发布时间】:2012-09-08 21:07:47
【问题描述】:
我有以下 xml:
<root>
<a>value1</a>
<b>value2</b>
<c>value3</c>
<a>value5</a>
<d>value4</d>
<b>value2</b>
<b>value3</b>
<a>value7</a>
</root>
我想选择节点//b[text()='value2']之后的第一个兄弟a,如果它后面没有另一个b节点(在这种情况下它将是<a>value5</a>,不应选择<a>value7</a>)。
执行此操作的 xpath 是什么?
我正在使用 .net 4 和 xpath 1.0
更新
这就是我的出发点:我正在解析的文档有一个非常愚蠢的结构,可以这样描述
<root>
<key>key-value</key>
<some-other-nodes>some other values</some-other-nodes>
<key>an other key value</key>
<value>the value</value>
</root>
我描述的文档包含以下键值对: 键值->{null} 另一个键值->{该值}
如果键节点重复,它会重置key 值。我需要一个 xpath 来选择特定键的值。因为在上面的示例中,//b[text()='value2'] 的第二个匹配项后面跟着<b>value3</b>,所以密钥被重置为value3
【问题讨论】:
-
这里的主要问题是根据xml中标签的顺序编写代码。
-
ArsenZahray:你有两个
<b>value2</b>元素——你必须更准确地说你想要其中的哪一个作为基础。<a>value7</a>是正确答案,以防最初选择这些 b 中的第一个。 -
ArsenZahray:这个问题是矛盾的——
<a>value5</a>后面跟着一个b——因此不能选择它——根据您的要求“我想选择第一个兄弟姐妹”节点//b[text()='value2']如果后面没有其他 b 节点”。请编辑并更正。 -
ArsenZahray:恕我直言,您的编辑令人费解——您希望它有什么意义吗?