如何在R中使用xpath导航XML

时间:2016-12-05 12:30:20

标签: r xml xpath pmml

我是否可以获得一些xpath导航帮助,以便与R?

中的XML文档一起使用

我提供了一个非常简化的实际数据版本来说明('my_xml')。一般来说,我希望导入一个pmml doc(由XML中的spss导出)到R。

对于这个例子,我想知道如何在属性='valid'的节点中返回'value'属性值。您将看到我已将一个属性设置为“无效”。

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(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 [@ attribute ='superduper'] )

但是当我使用xpath搜索文档中任何位置的'Value'节点时(即使用'//')....它返回一个空列表(NB - 我现在正在搜索'Value'节点使用大写字母'V',而不是'value'属性)

get_values = xpathApply(my_xml, "//Value") 
print(get_values) 

如果我使用句点...

搜索当前节点
my_current_node = xpathApply(my_xml, ".") 
print(my_current_node) 

这是另一个空列表 - 为什么不选择我当前的节点?

我想也许xpathApply正在寻找一些额外的args,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) 

不 - 我一定做错了!但是什么?

1 个答案:

答案 0 :(得分:3)

主要询问:

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)