在 R 中使用 XML2 包有条件地检索 XML 个节点

Conditional Retrieval of XML Nodes with XML2 package in R

我正试图在 R 中检索和过滤 XML 节点时掌握 xml2 包。

我有一个 XML 结构文件...

...
 <entry>
  <feature type="x">123</feature>
  <feature type="y">456</feature>
  <feature type="y">789</feature>
 </entry>
...

...我正在尝试检索 只是 在单个语句中类型为“y”的第一个“特征”。

目前我是这样做的:

# Return all <feature> nodes
xmlNodes <- xml_find_all(inputXml, ".//entry/feature")

# ...filter by type="y"...
xmlNodes <- xmlNodes[xml_attr(xmlNodes, "type")=="y"]

# ...and then return the first node
xmlNode <- xmlNodes[1]

有没有更简单的方法可以在一条语句中实现这一点,也许使用 xml_find_first() 函数和“type”==“y”条件,假设第一个特征节点可能不一定是 "type" = "y"?

可能是这样的:

xmlNode <- xml_find_first(inputXml, ".//entry/feature" & xml_attr(inputXml, "type")=="chain")

我觉得这是一个非常简单的问题,但我是 R 的新手并且不太熟悉所有语法...非常感谢!

这是关于 xpath 语法,而不是 R 语法。您的示例本身不是一个有效的 xml 文档来演示,因此我对其进行了一些扩展:

xml <- '<?xml version="1.0"?>
<entries>
<entry>
    <feature type="x">123</feature>
    <feature type="y">456</feature>
    <feature type="y">789</feature>
</entry>
<entry>
    <feature type="x">12</feature>
    <feature type="y">13</feature>
    <feature type="y">14</feature>
</entry>
</entries>'

如果我没理解错的话,您想要每个 entrytype = "y" 的第一个 feature,因此在我的示例中,这将是包含文本“456”和“ 13"。在这种情况下,正确的 xpath 表达式是 "//feature[@type = 'y'][1]".

所以你会得到正确的节点:

xml2::read_xml(xml) %>% xml2::xml_find_all("//feature[@type = 'y'][1]")
#> {xml_nodeset (2)}
#> [1] <feature type="y">456</feature>
#> [2] <feature type="y">13</feature>