2015-03-20 25 views
6

İçeriği bir veri çerçevesine okuyan bir dizi XML dosyası ve bir R komut dosyası sahibim. Ancak, her zamanki gibi ayrıştırmak istediğim dosyaları aldım, ancak ad alanı tanımlarında, değerlerini normal olarak XPath ifadeleriyle seçmeme izin vermeyen bir şey var.R'de ayrıştırma XML: Yanlış ad alanları

XML dosyaları bu şekildedir:

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> 

Diğeri:

xml_ns.xml

<?xml version="1.0" encoding="UTF-8"?> 
<XML xmlns="http://www.nonexistingsite.com"> 
    <Node> 
     <Name>Name 2</Name> 
     <Title>Title 2</Title> 
     <Date>2014</Date> 
    </Node> 
</XML> 

xmlns noktaları kokan URL var.

kullandığım R kodu şu şekildedir: Ancak

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 

, bir sonucudur olarak ne alıyorum: Ben ikinci dosyadan ad bağlantıyı kaldırırsanız

Filename   Name Title Date 
./xml_nons.xml  Name 1 Title 1 2015 

Doğru olsun :

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

Ben orijinal XML dosyaları gelenler ad alanlarını kaldırmak için bir XSL olabilir, ama ben anlamak istiyorum R içinde çalışan bir çözüm var. R'ye sadece XML deklarasyonundaki her şeyi görmezden gelmek için bir yol var mı?

cevap

3

İsim alanlarını görmezden gelmenin kolay bir yolu olmadığını düşünüyorum. En iyi yol onlarla yaşamayı öğrenmek. Bu cevap yeni XML2 paketini kullanacaktır. Aynı şey XML paket çözümü için de geçerlidir.

ilk ad d1 atanan

library(XML2) 
fname='myfile.xml' 
doc <- read_xml(fname) 
#peak at the namespaces 
xml_ns(doc) 

kullanın. Eğer XPath ne istediğinizi bulamazsanız, en olası sebep isim-alanıdır.

xpath <- "//d1:FormDef" 
ns <- xml_find_all(doc,xpath, xml_ns(doc)) 
ns 

Ayrıca, Yani yazmaktan kurtarır yapabileceğiniz yolu her element için bunu yapmak zorunda

library(stringr) 
> xpath <- "/ODM/Study" 
> (xpath<-str_replace_all(xpath,'/','/d1:')) 
[1] "/d1:ODM/d1:Study"