SimpleXMLElement :: xpath(返回符合条件的* some *子节点的节点)

时间:2013-02-23 22:06:31

标签: xml xpath

<?xml version="1.0" encoding="utf-8" ?>
<menu>
  <group Text="Group1">
    <item Text="Menu1" />
    <item Text="Menu2" Authenticated="0" />
    <item Text="Menu3" />
  </group>
  <group Text="Group2" Authenticated="1">
    <item Text="Menu4" />
    <item Text="Menu5" />
    <item Text="Menu6" />
  </group>
  <group Text="Group3" Authenticated="0">
    <item Text="Menu7" />
    <item Text="Menu8" />
    <item Text="Menu9" />
  </group>
</menu>

在上面的xml中,我希望返回包含子节点(项元素)的所有组元素,而不是那些具有Authenticated等于'0'

属性的组元素。

结果应该是这样的:

  <group Text="Group1">
    <item Text="Menu1" />
    <item Text="Menu3" />
  </group>
  <group Text="Group2" Authenticated="1">
    <item Text="Menu4" />
    <item Text="Menu5" />
    <item Text="Menu6" />
  </group>

*编辑:我尝试过以下xpath

/menu/group[not(@Authenticated) or @Authenticated = '1'][item[not(@Authenticated) or @Authenticated = '1']]

但它返回元素

<item Text="Menu2" Authenticated="0" />

我不希望在结果中。

2 个答案:

答案 0 :(得分:0)

我认为XPath没有一种方法能够准确地获得您正在寻找的内容,但如果您只是获得了经过身份验证的项目组,那该怎么办呢?

/menu/group/item[@Authenticated!='0' or not(@Authenticated)]

并取回这样的东西?

<menu>
  <item Text="Menu1"/>
  <item Text="Menu3"/>
  <item Text="Menu4"/>
  <item Text="Menu5"/>
  <item Text="Menu6"/>
  <item Text="Menu7"/>
  <item Text="Menu8"/>
  <item Text="Menu9"/>
</menu>

<强>更新

啊,我想我明白你的目标是什么。试试这个:

/menu/group/item[(@Authenticated!='0' or not(@Authenticated)) and (../@Authenticated!='0' or not(../@Authenticated))]

你应该得到:

<menu>
  <item Text="Menu1"/>
  <item Text="Menu3"/>
  <item Text="Menu4"/>
  <item Text="Menu5"/>
  <item Text="Menu6"/>
</menu>

答案 1 :(得分:0)

我不认为这在纯XPath中是可能的,至少不是XPath 1.我可能只是克隆XML并运行XPath来删除// * [@ Authenticated = 0],留下你想要的结果但是通过更迂回的方法。