2017-02-13 8 views
0

У меня есть 155 XML-файлов, которые нужно импортировать в R в качестве фреймворка данных. Я мало знаю об xml и испытываю трудности с получением узлов.Несколько XML-файлов в dataframe в R

Я хотел бы написать функцию, чтобы получить все данные в «d2p1: KeyValueOfintEpisodesmiwmOyvC»

Вот мой R код:

library(XML) 
xml_to_df<-function(xmlfile){ 
    results <- xmlParse(xmlfile) 
    df <- xmlToDataFrame(nodes = getNodeSet(results, "//CardEpisodes/d2p1:KeyValueOfintEpisodesmiwmOyvC")) 
    return(df) 
} 
my_files<-list.files(pattern="\\.xml$") 
my_data<-lapply(my_files,xml_to_df) 
new_df<-bind_rows(my_data) 

Этот код должен быть в состоянии объединить все свои XML-файлы в моем рабочего каталога и помещать их в один фрейм данных.

ошибка, что я получил это:

XPath Ошибка: Undefined префикс пространства имен
XPath ошибка: Invalidexpression

Я думаю, что моя ошибка должна быть в этой строке:

df <- xmlToDataFrame(nodes = getNodeSet(results, "//CardEpisodes/d2p1:KeyValueOfintEpisodesmiwmOyvC")) 

Как установить узлы?

Большое вам спасибо за помощь!

[Редактировать]

<?xml version="1.0"?> 
<CPRCard xmlns="http://schemas.datacontract.org/2004/07/CPRcardViewer" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" z:Id="i1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <CardEpisodes xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
     <d2p1:KeyValueOfintEpisodesmiwmOyvC> 
     <d2p1:Key>0</d2p1:Key> 
     <d2p1:Value> 
      <AdqDepth>4</AdqDepth> 
      <AdqRate>64</AdqRate> 
      <AvgDepth>39</AvgDepth> 
      <card z:Ref="i1"/> 
     </d2p1:Value> 
     </d2p1:KeyValueOfintEpisodesmiwmOyvC> 

     <d2p1:KeyValueOfintEpisodesmiwmOyvC> 
     <d2p1:Key>1</d2p1:Key> 
      <d2p1:Value> 
       <AdqDepth>17</AdqDepth> 
       <AdqRate>28</AdqRate> 
       <AvgDepth>45</AvgDepth> 
       <card z:Ref="i1"/> 
      </d2p1:Value> 
     </d2p1:KeyValueOfintEpisodesmiwmOyvC> 
    </CardEpisodes> 
</CPRCard> 
+1

Pls вставить копию -able образец xml-файла – GGamba

+0

@GGamba Я отредактировал сообщение и добавил образец для копирования xml-файла. Я спрятал некоторые данные, потому что он слишком длинный. Это нормально? –

ответ

0

Что вам не хватает является определение пространства имен, я не эксперт, но то, что ошибка говорит: «Я не знаю, что означает» d2p1. Чтобы избежать этого нужно добавить namespaces аргумент в getNodeSet вызова:

getNodeSet(x, "//d2p1:KeyValueOfintEpisodesmiwmOyvC", 
      namespaces = c(d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays")) 

Я нашел пространство имен, указанное в полной XML.


В любом случае вставки именно это в функцию xmlToDataFrame вызовет проблемы, потому что первый уровень узла состоит только в Key и Value поле. Поле Value затем содержит 3 точки данных.

xmlToDataFrame(nodes = getNodeSet(x, 
          "//d2p1:KeyValueOfintEpisodesmiwmOyvC", 
          c(d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"))) 
# Key Value 
# 1 0 46439 
# 2 1 172845 

Чтобы избежать этого, мы должны сделать два разные вызов, один к retrive на 3 значения и один для ключа:

values <- xmlToDataFrame(nodes = getNodeSet(x, 
          "//d2p1:KeyValueOfintEpisodesmiwmOyvC/d2p1:Value", 
          c(d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"))) 

keys <- xmlToDataFrame(nodes = getNodeSet(x, 
          "//d2p1:KeyValueOfintEpisodesmiwmOyvC", 
          c(d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"))) 
# Bind and clean 
result <- data.frame(Key = keys[, 1], values[, 1:3]) 

Надеется, что это помогает