如何在 R 中使用 xpath 导航 XML
How to navigate XML with xpath in R
请给我一些 xpath 导航帮助,以便与 R 中的 XML 文档一起使用?
我提供了一个非常精简的实际数据版本来说明 ('my_xml')。一般来说,我希望将 pmml 文档(由 XML 中的 spss 导出)导入 R。
对于此示例,我想知道如何 return 'value' 节点中的 'value' 属性值,其中 属性 属性 ='valid'。你会看到我设置了一个 属性 到 'notvalid'.
my_xml = xmlParse('<?xml version="1.0" encoding="UTF-8"?>
<PMML xmlns="http://www.dmg.org/PMML-4_1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="4.1" xsi:schemaLocation="http://www.dmg.org/PMML-4_1 pmml-4-1.xsd">
<Header copyright="(C) Copyright IBM Corp. 1989, 2014.">
<Application name="IBM SPSS Statistics 23.0" version="23.0.0.0"/>
</Header><DataDictionary numberOfFields="15">
<DataField dataType="string" displayName="Target_Status_OIDV_M!" name="Target_Status_OIDV_M!" optype="categorical">
<Extension extender="spss.com" name="format" value="1"/>
<Extension extender="spss.com" name="width" value="1"/>
<Extension extender="spss.com" name="decimals" value="0"/>
<Value displayValue="F" property="valid" value="F"/>
<Value displayValue="T" property="valid" value="T"/>
</DataField>
<DataField dataType="string" displayName="Status_OIDV_M2" name="Status_OIDV_M2" optype="categorical">
<Extension extender="spss.com" name="format" value="1"/>
<Extension extender="spss.com" name="width" value="4"/>
<Extension extender="spss.com" name="decimals" value="0"/>
<Value displayValue="0000" property="valid" value="0000"/>
<Value displayValue="0001" property="valid" value="0001"/>
<Value displayValue="0100" property="notvalid" value="0100"/>
</DataField>
</DataDictionary>
</PMML>')
我检查 class...并查找所有值
class(my_xml) # "XMLInternalDocument" - excellent... just what xpathApply is looking for :)
get_value_attr = xpathApply(my_xml, "//@value")
print(get_value_attr) # a start in the right direction
所以接下来我尝试使用我的 属性 条件...但我只得到一个空列表
get_value_attr_with_condition = xpathApply(my_xml, "//@value[@property='valid']")
print(get_value_attr_with_condition) # returns an empty list
这让我意识到,在我见过的所有示例中,方括号属性条件仅用于节点,我从未见过 运行 具有另一个属性(即 //mynodename[@属性='superduper'])
但是当我使用 xpath 搜索文档中任意位置的 'Value' 节点时(即使用“//”)...它 return 是一个空列表(注意 - 我我现在搜索具有大写 'V' 的 'Value' 节点,而不是 'value' 属性)
get_values = xpathApply(my_xml, "//Value")
print(get_values)
如果我搜索当前节点,使用句点...
my_current_node = xpathApply(my_xml, ".")
print(my_current_node)
这是另一个空列表 - 为什么这个select不是我当前的节点?[=17=]
我想也许 xpathApply 正在寻找一些额外的参数,尝试了 3 次...
get_that_value = xpathApply(my_xml, "//Value", xmlGetAttr, "value")
print(get_that_value) # empty list again
get_that_property = xpathApply(my_xml, "//Value", xmlGetAttr, "property")
print(get_that_property) # empty list again
get_the_xmlValue = xpathApply(my_xml, "//Value", xmlValue)
print(get_the_xmlValue)
不对 - 我一定是做错了什么!但是什么???
主要询价:
xpathSApply(my_xml, "//*[@value and @property='valid']/@value")
第二次查询需要处理默认命名空间:
nsDefs <- xmlNamespaceDefinitions(my_xml)
ns <- structure(sapply(nsDefs, function(x) x$uri), names = names(nsDefs))
names(ns)[1] <- "x"
xpathSApply(my_xml, "//x:Value", namespaces=ns)
请给我一些 xpath 导航帮助,以便与 R 中的 XML 文档一起使用?
我提供了一个非常精简的实际数据版本来说明 ('my_xml')。一般来说,我希望将 pmml 文档(由 XML 中的 spss 导出)导入 R。
对于此示例,我想知道如何 return 'value' 节点中的 'value' 属性值,其中 属性 属性 ='valid'。你会看到我设置了一个 属性 到 'notvalid'.
my_xml = xmlParse('<?xml version="1.0" encoding="UTF-8"?>
<PMML xmlns="http://www.dmg.org/PMML-4_1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="4.1" xsi:schemaLocation="http://www.dmg.org/PMML-4_1 pmml-4-1.xsd">
<Header copyright="(C) Copyright IBM Corp. 1989, 2014.">
<Application name="IBM SPSS Statistics 23.0" version="23.0.0.0"/>
</Header><DataDictionary numberOfFields="15">
<DataField dataType="string" displayName="Target_Status_OIDV_M!" name="Target_Status_OIDV_M!" optype="categorical">
<Extension extender="spss.com" name="format" value="1"/>
<Extension extender="spss.com" name="width" value="1"/>
<Extension extender="spss.com" name="decimals" value="0"/>
<Value displayValue="F" property="valid" value="F"/>
<Value displayValue="T" property="valid" value="T"/>
</DataField>
<DataField dataType="string" displayName="Status_OIDV_M2" name="Status_OIDV_M2" optype="categorical">
<Extension extender="spss.com" name="format" value="1"/>
<Extension extender="spss.com" name="width" value="4"/>
<Extension extender="spss.com" name="decimals" value="0"/>
<Value displayValue="0000" property="valid" value="0000"/>
<Value displayValue="0001" property="valid" value="0001"/>
<Value displayValue="0100" property="notvalid" value="0100"/>
</DataField>
</DataDictionary>
</PMML>')
我检查 class...并查找所有值
class(my_xml) # "XMLInternalDocument" - excellent... just what xpathApply is looking for :)
get_value_attr = xpathApply(my_xml, "//@value")
print(get_value_attr) # a start in the right direction
所以接下来我尝试使用我的 属性 条件...但我只得到一个空列表
get_value_attr_with_condition = xpathApply(my_xml, "//@value[@property='valid']")
print(get_value_attr_with_condition) # returns an empty list
这让我意识到,在我见过的所有示例中,方括号属性条件仅用于节点,我从未见过 运行 具有另一个属性(即 //mynodename[@属性='superduper'])
但是当我使用 xpath 搜索文档中任意位置的 'Value' 节点时(即使用“//”)...它 return 是一个空列表(注意 - 我我现在搜索具有大写 'V' 的 'Value' 节点,而不是 'value' 属性)
get_values = xpathApply(my_xml, "//Value")
print(get_values)
如果我搜索当前节点,使用句点...
my_current_node = xpathApply(my_xml, ".")
print(my_current_node)
这是另一个空列表 - 为什么这个select不是我当前的节点?[=17=]
我想也许 xpathApply 正在寻找一些额外的参数,尝试了 3 次...
get_that_value = xpathApply(my_xml, "//Value", xmlGetAttr, "value")
print(get_that_value) # empty list again
get_that_property = xpathApply(my_xml, "//Value", xmlGetAttr, "property")
print(get_that_property) # empty list again
get_the_xmlValue = xpathApply(my_xml, "//Value", xmlValue)
print(get_the_xmlValue)
不对 - 我一定是做错了什么!但是什么???
主要询价:
xpathSApply(my_xml, "//*[@value and @property='valid']/@value")
第二次查询需要处理默认命名空间:
nsDefs <- xmlNamespaceDefinitions(my_xml)
ns <- structure(sapply(nsDefs, function(x) x$uri), names = names(nsDefs))
names(ns)[1] <- "x"
xpathSApply(my_xml, "//x:Value", namespaces=ns)