2016-09-28 29 views
0

我想檢查xml文件中是否存在特定的節點。我正在處理非結構化數據,因此某些節點不會出現在每個xml文件中,並且有時會出現多次出現的相同節點名稱,除非它們是其他節點的子節點。如果多次出現相同的節點名稱,如何在R中選擇特定的xml節點?

下面是一個xml文件示例,與我正在使用的文件類似。如你所見,節點NM出現兩次。但是,我只想要第一個值,而不是發生的其他值。有沒有辦法指定我只想要檢索NM的第一次出現?如果它是另一個節點的子節點,即那些是StagesStage子節點的子節點,那麼或者我不想要NM值。

我正在使用包XML,以下是檢索節點詳細信息的代碼。

XML:

<Product> 
    <ID>1</ID> 
    <NM>Product Name</NM> 
    <DN>Product Description</DN> 
    <SalesStage> 
     <NM>Sales Stage Name</NM> 
    </SalesStage> 
</Product> 

R代碼裏面:

doc = xmlInternalTreeParse("File.xml") 

NM_Node = xpathApply(doc, "//NM") 
print(NM_Node) 

[[1]] 
<NM>Product Name</NM> 

[[2]] 
<NM>Sales Stage Name</NM> 

attr(,"class") 
[1] "XMLNodeSet" 

因此,在短期,我只想找回價值 「產品名稱」,而不是 「銷售藝名」。無論如何,我可以在R中實現這一點嗎?

回答

3

我從來沒有玩過R,但xPath是xPath,所以就這樣了。您是否嘗試過:

NM_Node = xpathApply(doc, "//Product/NM") 

這應該只給你一個名爲Product的父節點的NM節點,而不管它在文件中的位置。

這裏有一個完整的例子:

text <- "<Product> 
    <ID>1</ID> 
    <NM>Product Name</NM> 
    <DN>Product Description</DN> 
    <SalesStage> 
     <NM>Sales Stage Name</NM> 
    </SalesStage> 
</Product>" 

library(XML) 

doc <- xmlInternalTreeParse(text) 

xpathApply(doc, "//Product/NM", xmlValue) 
## [[1]] 
## [1] "Product Name" 

xpathSApply(doc, "//Product/NM", xmlValue) 
## [1] "Product Name" 

你可以看到什麼樣的兩個不同的XML *apply報表做差價。一個返回一個列表,另一個返回一個字符向量。

+0

'xpathSapply()'以及(VS'xpathApply()')如果OP只是想要一個特徵向量回來。但是,對於從未與R合作過的人來說,可靠的代碼。 – hrbrmstr

+0

@亞歷A你知道我可以發誓我已經嘗試過,但低,看到它的作品!非常感謝!真的很感激它! – Eoin

+0

@hrbrmstr'xpathSapply()'和'xpathApply()'有什麼區別? – Eoin

1

交替xml2

text <- "<Product> 
    <ID>1</ID> 
    <NM>Product Name</NM> 
    <DN>Product Description</DN> 
    <SalesStage> 
     <NM>Sales Stage Name</NM> 
    </SalesStage> 
</Product>" 

library(xml2) 

doc <- read_xml(text) 
xml_find_all(doc, "//Product/NM") %>% xml_text() 
相關問題