Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中解析嵌套的XML(带有名称空间)_R_Xml_Xpath_Xml Parsing_Nested - Fatal编程技术网

在R中解析嵌套的XML(带有名称空间)

在R中解析嵌套的XML(带有名称空间),r,xml,xpath,xml-parsing,nested,R,Xml,Xpath,Xml Parsing,Nested,我试图解析来自web API的xml响应 对于下面这样一个简单的xml,我能够使用xpathSApply并非常轻松地获取相关数据 下面是example.xml <?xml version="1.0" encoding="UTF-8"?> <CATALOG> <PLANT> <COMMON>Bloodroot</COMMON> <BOTANICAL>Sanguinaria canaden

我试图解析来自web API的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"

血根
美洲血根草
4.
大部分是阴凉的
$2.44
031599
鸽的
加拿大水曲柳
3.
大部分是阴凉的
$9.37
030699
>库(XML)
>DocRootNodeExpathsApply(rootNode,“//COMMON”,xmlValue)
[1] 血根
>getNodeSet(文件“//工厂”)
[[1]]
血根
美洲血根草
4.
大部分是阴凉的
$2.44
031599
[[2]]
鸽的
加拿大水曲柳
3.
大部分是阴凉的
$9.37
030699
属性(,“类”)
[1] “XMLNodeSet”
>xmlsaply(getNodeSet(rootNode,//PRICE),xmlValue)#提供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>

血根
美洲血根草
4.
2.3
100
大部分是阴凉的
$2.44
031599
鸽的
加拿大水曲柳
3.
9
100
大部分是阴凉的
$9.37
030699
以下命令不会从上述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()
>docrootNode xpathsaply(rootNode,“//COMMON”,xmlValue)
列表()
>getNodeSet(文件“//工厂”)
列表()
属性(,“类”)
[1] “XMLNodeSet”
>xmlsaply(getNodeSet(rootNode,//PRICE),xmlValue)
列表()
在XPATH中使用
name()
local-name()

library(XML)

appText <- '<?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>'
doc <- xmlParse(appText)
> xpathSApply(doc,"//*[name()='COMMON']", xmlValue)
[1] "Bloodroot" "Columbine"
或使用
xml2
软件包:

library(xml2)
doc <- read_xml(appText)
# check namespaces
> xml_ns(doc)
d1 <-> http://entrader.contigoenergy.com/Contigo.Entrader.Service
i  <-> http://www.w3.org/2001/XMLSchema-instance
s  <-> http://schemas.xmlsoap.org/soap/envelope/
u  <-> http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd

> xml_text(xml_find_all(doc, "//d1:COMMON"))
[1] "Bloodroot" "Columbine"
库(xml2)
文档xml\n(文档)
d1http://entrader.contigoenergy.com/Contigo.Entrader.Service
我http://www.w3.org/2001/XMLSchema-instance
shttp://schemas.xmlsoap.org/soap/envelope/
Uhttp://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd
>xml\u文本(xml\u find\u all(doc,//d1:COMMON))
[1] 血根

非常感谢@jdharison。
library(xml2)
doc <- read_xml(appText)
# check namespaces
> xml_ns(doc)
d1 <-> http://entrader.contigoenergy.com/Contigo.Entrader.Service
i  <-> http://www.w3.org/2001/XMLSchema-instance
s  <-> http://schemas.xmlsoap.org/soap/envelope/
u  <-> http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd

> xml_text(xml_find_all(doc, "//d1:COMMON"))
[1] "Bloodroot" "Columbine"