Мне должно быть что-то невероятно очевидно, и я, наконец, отказался от попыток выяснить, что не так. Я пытаюсь найти простой фрагмент 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.
При определении 'xpath' вы должны учитывать пространство имен (вторая строка файла имеет атрибут' xmlns = ... '). Если вы вручную удалите этот атрибут, вы получите желаемый результат с кодом. – nicola
Что делать, если я не могу просто удалить его вручную? Я получаю это от вызова API, и я бы не стал вручную разбирать это из строки. –
Попробуйте следующее: 'category_nodes <- getNodeSet (root, '// as: Parent', namespaces = c (as =" http://mws.amazonservices.com/schema/Products/2011-10-01 "))' – bergant