2016-12-05 6 views
0

Могу ли я получить какую-либо навигационную помощь xpath, пожалуйста, для использования с XML-документом в R?Как перемещаться по XML с помощью xpath в R

Я представил очень урезанную версию моих фактических данных, чтобы проиллюстрировать ('my_xml'). В общем, я хочу импортировать pmml doc (экспортированный spss в XML) в R.

В этом примере я хотел бы знать, как я могу вернуть значения атрибута value в узлах, где атрибуты свойства = «действительный». Вы увидите, что я присвоил одному свойству значение «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(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», а не «значение» атрибута)

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

Если Я ищу для текущего узла, используя период ...

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

это еще один пустой список - почему это не мой выбор текущего узла?

Я думал, что, может быть, 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) 

Неа - я должен делать что-то неправильно! Но что???

+0

'xpathSApply (узел my_xml«// * [@ значение и @ свойство = 'valid'] ")'/'xpathSApply (my_xml," // * [@ value и @ property = 'valid']/@ value ")' – hrbrmstr

+0

Thnx @hrbrmstr, второе решение комментариев взломано! Просто я искал. – 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

Смежные вопросы