2016-12-05 8 views
0

RのXML文書で使用するために、xpathのナビゲーション支援をお願いできますか?xpathでXMLをナビゲートする方法R

説明するために私の実際のデータ( 'my_xml')を削除しました。一般的に、私はpmml doc(XMLでspssによってエクスポートされた)をRにインポートしようとしています。

この例では、どのように属性属性= '有効'。私は1つのプロパティを 'not invalid'に設定していることがわかります。

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で '値'ノードを検索すると、ドキュメント内のどこにでももし私が今の首都「V」ではなく、「値」属性と「値」ノードを検索しています)

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

- )「//」が....それは空のリストを返します(NB期間を使用して現在のノードを検索します。

my_current_node = xpathApply(my_xml, ".") 
print(my_current_node) 

これは別の空のリストです - なぜ私の現在のノードが選択されていませんか?

私は...

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) 

いや3つの試み、多分xpathApplyは、いくつかの追加の引数を探していたと思った - 私は何か間違ったことしなければなりません!しかし何?主なお問い合わせについては

+0

'xpathSApply(ノードがmy_xml、「// * [@値と@ "0 * @値と@プロパティ= '有効な値') ' – hrbrmstr

+0

Thnx @hrbrmstr、2番目のコメント解決策が注目に値する!私が探していただけでした。 – CallumH

+0

私はもう少しお問い合わせできますが、 'get_values = xpathApply(my_xml、" // Value ")'がすべての 'Value'ノードを返さなかったのでしょうか?空リストも返されました。 – CallumH

答えて

1

:第二の問い合わせについては

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) 
+0

これはすべての非常に有用な@hrbrmstrです。明らかに目に合っているか、オンラインのチュートリアルにあるよりもxpathに多くあります。 Thnx。 – CallumH

関連する問題