Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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_Xml Namespaces_Xml2 - Fatal编程技术网

解析R中的XML:名称空间不正确

解析R中的XML:名称空间不正确,r,xml,xml-namespaces,xml2,R,Xml,Xml Namespaces,Xml2,我有一堆XML文件和一个R脚本,可以将它们的内容读入数据帧。然而,我现在得到了我想要像往常一样解析的文件,但是在它们的名称空间定义中有一些东西不允许我正常地使用XPath表达式来选择它们的值 XML文件如下所示: library(XML) xmlfiles <- list.files(path = ".", pattern="*.xml$", full.names = TRUE,

我有一堆XML文件和一个R脚本,可以将它们的内容读入数据帧。然而,我现在得到了我想要像往常一样解析的文件,但是在它们的名称空间定义中有一些东西不允许我正常地使用XPath表达式来选择它们的值

XML文件如下所示:

library(XML)

xmlfiles <- list.files(path = ".", 
                       pattern="*.xml$", 
                       full.names = TRUE, 
                       recursive = TRUE)

n <- length(xmlfiles)
dat <- vector("list", n)

for(i in 1:n){
       doc <- xmlTreeParse(xmlfiles[i], useInternalNodes = TRUE)
       nodes <- getNodeSet(doc, "//XML")
       x <- lapply(nodes, function(x){ data.frame(
              Filename = xmlfiles[i],
              Name = xpathSApply(x, ".//Node/Name" , xmlValue),
              Title = xpathSApply(x, ".//Node/Title" , xmlValue),
              Date = xpathSApply(x, ".//Node/Date" , xmlValue)
            )})
            dat[[i]] <- do.call("rbind", x)
    }

    xml <- do.call("rbind", dat)
    xml
xml_nons.xml

<?xml version="1.0" encoding="UTF-8"?>
<XML>
   <Node>
      <Name>Name 1</Name>
      <Title>Title 1</Title>
      <Date>2015</Date>
   </Node>
</XML>
如果从第二个文件中删除名称空间链接,则会得到正确的结果:

Filename            Name    Title    Date
./xml_nons_1.xml    Name 1  Title 1  2015
./xml_ns_1.xml      Name 2  Title 2  2014

当然,我可以使用XSL从原始XML文件中删除这些名称空间,但我希望有一些在R中工作的解决方案。是否有某种方法可以告诉R忽略XML声明中的所有内容?

我认为没有简单的方法可以忽略名称空间。最好的办法是学会和他们一起生活。此答案将使用较新的XML2包。但这同样适用于XML包解决方案

使用

库(XML2)
fname='myfile.xml'
医生
Filename            Name    Title    Date
./xml_nons.xml      Name 1  Title 1  2015
Filename            Name    Title    Date
./xml_nons_1.xml    Name 1  Title 1  2015
./xml_ns_1.xml      Name 2  Title 2  2014
library(XML2)
fname='myfile.xml'
doc <- read_xml(fname)
#peak at the namespaces
xml_ns(doc)
xpath <-  "//d1:FormDef"
ns <- xml_find_all(doc,xpath, xml_ns(doc))
ns
library(stringr)
> xpath <-  "/ODM/Study"
> (xpath<-str_replace_all(xpath,'/','/d1:'))
[1] "/d1:ODM/d1:Study"