Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPath获取所有父节点,这些父节点具有具有特定属性的任何子节点_Xpath - Fatal编程技术网

XPath获取所有父节点,这些父节点具有具有特定属性的任何子节点

XPath获取所有父节点,这些父节点具有具有特定属性的任何子节点,xpath,Xpath,我有一个没有一致结构的XML。我需要看看是否有一种简单的方法来搜索至少有一个子节点且属性为modified=“yes”的所有父节点。使用XPath有没有一种简单的方法?我将要处理的XML非常庞大,我将使用一种4GL语言,它不具备Visual Studio的所有功能,但它确实提供了一些COM对象来帮助导航XML DOM。代码看起来与我在VisualStudio中所做的非常相似(请参见下面的示例xml) 示例XML(大大简化,易于阅读): 应该很有希望返回给我:XmlNodeList对象中的BOOK

我有一个没有一致结构的XML。我需要看看是否有一种简单的方法来搜索至少有一个子节点且属性为modified=“yes”的所有父节点。使用XPath有没有一种简单的方法?我将要处理的XML非常庞大,我将使用一种4GL语言,它不具备Visual Studio的所有功能,但它确实提供了一些COM对象来帮助导航XML DOM。代码看起来与我在VisualStudio中所做的非常相似(请参见下面的示例xml)

示例XML(大大简化,易于阅读):

应该很有希望返回给我:XmlNodeList对象中的BOOK、MAGAZINE、KINDLE和EMAIL节点

不应选择报纸节点,因为它没有具有modified=“yes”属性的子节点,即使报纸节点本身具有此属性。

请尝试:

//*[descendant::*[@modified='yes']]
或者更准确地说:

/*/*[descendant::*[@modified='yes']]

编辑:使用上述XPath和修改后的示例XML返回的示例

XML

<RootNode>
  <BOOK>
    <PRICE modified="yes">15</PRICE>
    <COPIES>10</COPIES>
  </BOOK>
  <foo>
    <bar>
      <baz>
        <yabba>
          <dabba>
            <doo modified="yes"/>
          </dabba>
        </yabba>
      </baz>
    </bar>
  </foo>
  <MAGAZINE>
    <PRICE>8</PRICE>
    <COPIES modified="yes">100</COPIES>
  </MAGAZINE>
  <NEWSPAPER modified="yes">
    <PRICE>2</PRICE>
    <COPIES>75</COPIES>
  </NEWSPAPER>
  <KINDLE_SUB>
    <PRICE modified="yes">6</PRICE>
    <COPIES/>
  </KINDLE_SUB>
  <EMAIL_SUB>
    <UNSUBSCRIBE modified="yes">1</UNSUBSCRIBE>
  </EMAIL_SUB>
</RootNode>
/*/*[后代::*[@modified='yes']
将返回:

RootNode
BOOK
foo
bar
baz
yabba
dabba
MAGAZINE
KINDLE_SUB
EMAIL_SUB
BOOK
foo
MAGAZINE
KINDLE_SUB
EMAIL_SUB

可能是这样的:
/*/*[*[@modified='yes']]

这些XPath不会只选择元素的第一个祖先,而不是父元素吗?@AlehDouhi-我不确定你的确切意思,但
@modified
的深度并不重要。返回的内容因使用的xpath而异。它们都返回OP想要的内容,除了第一个还返回
RootNode
。由于OP声明示例XML被大大简化,因此很难判断当深度大于示例中的深度时会发生什么。我将用一个将返回的示例更新我的答案。明白。是的,我的意思是,如果深度更大,这些XPath将返回非直接父级。@AlehDouhi-是的,你是对的。如果OP只需要直接父级,并且深度大于示例,那么应该使用您的xpath。
RootNode
BOOK
foo
bar
baz
yabba
dabba
MAGAZINE
KINDLE_SUB
EMAIL_SUB
BOOK
foo
MAGAZINE
KINDLE_SUB
EMAIL_SUB