2015-11-21 3 views
1

Мне должно быть что-то невероятно очевидно, и я, наконец, отказался от попыток выяснить, что не так. Я пытаюсь найти простой фрагмент XML, чтобы найти все узлы <Parent>. Я использую R 3.2.2 и XML-пакет. Вот код с примером XML:Поиск XML с использованием XPath, не возвращающего узлов

library(XML) 

example_xml <- paste(
    '<?xml version="1.0"?>', 
    '<GetProductCategoriesForASINResponse xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">', 
     '<GetProductCategoriesForASINResult>', 
     '<Self>', 
      '<ProductCategoryId>11056341</ProductCategoryId>', 
      '<ProductCategoryName>Chicken</ProductCategoryName>', 
      '<Parent>', 
      '<ProductCategoryId>11056281</ProductCategoryId>', 
      '<ProductCategoryName>Dog</ProductCategoryName>', 
      '<Parent>', 
       '<ProductCategoryId>11055991</ProductCategoryId>', 
       '<ProductCategoryName>Monkey</ProductCategoryName>', 
       '<Parent>', 
       '<ProductCategoryId>11055981</ProductCategoryId>', 
       '<ProductCategoryName>Frog</ProductCategoryName>', 
       '<Parent>', 
        '<ProductCategoryId>3760911</ProductCategoryId>', 
        '<ProductCategoryName>Iguana</ProductCategoryName>', 
       '</Parent>', 
       '</Parent>', 
      '</Parent>', 
      '</Parent>', 
     '</Self>', 
     '</GetProductCategoriesForASINResult>', 
    '<ResponseMetadata>', 
     '<RequestId>abs123</RequestId>', 
    '</ResponseMetadata>', 
    '</GetProductCategoriesForASINResponse>', 
    sep = '' 
) 

categories_xml <- xmlTreeParse(example_xml, useInternalNodes = TRUE) 
root <- xmlRoot(categories_xml) 
category_nodes <- getNodeSet(root, '//Parent') 

Я бы ожидать category_nodes содержать 4 узлов, но вместо этого он возвращается 0.

+0

При определении 'xpath' вы должны учитывать пространство имен (вторая строка файла имеет атрибут' xmlns = ... '). Если вы вручную удалите этот атрибут, вы получите желаемый результат с кодом. – nicola

+0

Что делать, если я не могу просто удалить его вручную? Я получаю это от вызова API, и я бы не стал вручную разбирать это из строки. –

+1

Попробуйте следующее: 'category_nodes <- getNodeSet (root, '// as: Parent', namespaces = c (as =" http://mws.amazonservices.com/schema/Products/2011-10-01 "))' – bergant

ответ

1

Вы должны использовать элемент с пространством имен в выражении XPath:

getNodeSet(root, '//as:Parent', namespaces = c(as="http://mws.amazonservices.com/schema/Products/2011-10-01")) 

и, как Nicola отметил, что вы можете получить пространство имен из элемента, который дает вам:

getNodeSet(root, '//as:Parent', namespaces = c(as=xmlNamespace(root)))