1
我想解析來自Web API的XML響應。在R中解析嵌套的XML(帶名稱空間)
對於如下簡單的xml,我可以使用xpathSApply並很容易地獲取相關數據。
以下是的example.xml
<?xml version="1.0" encoding="UTF-8"?>
<CATALOG>
<PLANT>
<COMMON>Bloodroot</COMMON>
<BOTANICAL>Sanguinaria canadensis</BOTANICAL>
<ZONE>4</ZONE>
<LIGHT>Mostly Shady</LIGHT>
<PRICE>$2.44</PRICE>
<AVAILABILITY>031599</AVAILABILITY>
</PLANT>
<PLANT>
<COMMON>Columbine</COMMON>
<BOTANICAL>Aquilegia canadensis</BOTANICAL>
<ZONE>3</ZONE>
<LIGHT>Mostly Shady</LIGHT>
<PRICE>$9.37</PRICE>
<AVAILABILITY>030699</AVAILABILITY>
</PLANT>
</CATALOG>
>library(XML)
>doc<-xmlTreeParse("example.xml",useInternal=TRUE)
>rootNode<-xmlRoot(doc)
>xpathSApply(rootNode,"//COMMON",xmlValue)
[1] "Bloodroot" "Columbine"
> getNodeSet(doc,"//PLANT")
[[1]]
<PLANT>
<COMMON>Bloodroot</COMMON>
<BOTANICAL>Sanguinaria canadensis</BOTANICAL>
<ZONE>4</ZONE>
<LIGHT>Mostly Shady</LIGHT>
<PRICE>$2.44</PRICE>
<AVAILABILITY>031599</AVAILABILITY>
</PLANT>
[[2]]
<PLANT>
<COMMON>Columbine</COMMON>
<BOTANICAL>Aquilegia canadensis</BOTANICAL>
<ZONE>3</ZONE>
<LIGHT>Mostly Shady</LIGHT>
<PRICE>$9.37</PRICE>
<AVAILABILITY>030699</AVAILABILITY>
</PLANT>
attr(,"class")
[1] "XMLNodeSet"
> xmlSApply(getNodeSet(rootNode,"//PRICE"),xmlValue) #provides a list of all PRICE values in the xml
[1] "$2.44" "$9.37"
然而,同樣的命令沒有爲以下XML具有命名空間的細節工作。無論如何,我可以獲取節點/標籤中的數據。
以下是example1.xml
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><s:Body><GetByFilterTradeResponse xmlns="http://entrader.contigoenergy.com/Contigo.Entrader.Service"><GetByFilterTradeResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<CATALOG>
<CATEGORY>
<FAMILY>
<PLANT>
<COMMON>Bloodroot</COMMON>
<BOTANICAL>Sanguinaria canadensis</BOTANICAL>
<ZONE>4</ZONE>
<DETAILS>
<PRICEINBULK>2.3</PRICEINBULK>
<MINVOLUME>100</MINVOLUME>
</DETAILS>
<LIGHT>Mostly Shady</LIGHT>
<PRICE>$2.44</PRICE>
<AVAILABILITY>031599</AVAILABILITY>
</PLANT>
<PLANT>
<COMMON>Columbine</COMMON>
<BOTANICAL>Aquilegia canadensis</BOTANICAL>
<ZONE>3</ZONE>
<DETAILS>
<PRICEINBULK>9.00</PRICEINBULK>
<MINVOLUME>100</MINVOLUME>
</DETAILS>
<LIGHT>Mostly Shady</LIGHT>
<PRICE>$9.37</PRICE>
<AVAILABILITY>030699</AVAILABILITY>
</PLANT>
</FAMILY>
</CATEGORY>
</CATALOG>
</GetByFilterTradeResult></GetByFilterTradeResponse></s:Body></s:Envelope>
以下命令不從上面的XML
>doc<-xmlTreeParse("example1.xml",useInternal=TRUE)
>rootNode<-xmlRoot(doc)
> xpathSApply(rootNode,"//COMMON",xmlValue)
list()
> getNodeSet(doc,"//PLANT")
list()
attr(,"class")
[1] "XMLNodeSet"
> xmlSApply(getNodeSet(rootNode,"//PRICE"),xmlValue)
list()
非常感謝您@jdharrison。 –