2015-07-28 2 views
0

Я использую последнюю версию R, 3.2.1, с пакетом XML, чтобы попытаться прочитать XML-файл и преобразовать его в фрейм данных. Я новичок в xml, но имею небольшой опыт работы с R. Мой xml-файл находится в следующем формате.Проблема с чтением XML с помощью R

<?xml version="1.0" encoding="UTF-8"?> 
<campusRoot> 
    <Header baseURL="https://url" date="date" time="time" calendarCookie="0" calendarScope="0"> 
     <Param name="x" value="adhoc.AdHocFilter-listAdhocData"/> 
     <Param name="filterID" value="num"/> 
     <Param name="calendarID" value="0"/> 
     <Param name="source" value="live"/> 
     <Param name="saveAs" value="extract.xml"/> 
     <User userID="number" username="user" > 
      <financeAccountAccessRights/> 
      <financeAccountReportRights/> 
      <userGroups> 
       <UserGroup groupID="num" name="Ad Hoc" isSecurityRole="false" addContent="true" lock="false"/> 
      </userGroups> 
     </User> 
    </Header> 
    <ExportWizard> 
     <DisplayPreferences> 
      <Field name="sch.number" attribute="sch.number" type="varchar" nooutput="false" seq="" sortOrder="" sortDirection="" alignment="" formatting="" size=""/> 
      <Field name="sch.name" attribute="sch.name" type="varchar" nooutput="false" seq="" sortOrder="" sortDirection="" alignment="" formatting="" size=""/> 
      <Field name="sch.type" attribute="sch.type" type="varchar" nooutput="false" seq="" sortOrder="" sortDirection="" alignment="" formatting="" size=""/> 
      <Field name="sch.comments" attribute="sch.comments" type="varchar" nooutput="false" seq="" sortOrder="" sortDirection="" alignment="" formatting="" size=""/> 
      <Field name="sch.schoolID" attribute="sch.schoolID" type="int" nooutput="false" seq="" sortOrder="" sortDirection="" alignment="" formatting="" size=""/> 
      <Field name="student.grade" attribute="student.grade" type="varchar" nooutput="false" seq="" sortOrder="" sortDirection="" alignment="" formatting="" size=""/> 
     </DisplayPreferences> 
     <Extract name="00_Schools"> 
      <group tier="0" groupBy="All" groupSort="ASC" value="Records" adHocRowLimit="5000000" dataColumns="6"> 
       <student sch.number="1234" sch.name="name" sch.type="AAA" sch.comments="" sch.schoolID="00" student.grade="00"/> 
       <student sch.number="1234" sch.name="name" sch.type="AAA" sch.comments="" sch.schoolID="00" student.grade="00"/> 
       <student sch.number="1234" sch.name="name" sch.type="AAA" sch.comments="" sch.schoolID="00" student.grade="00"/> 
       <student sch.number="1234" sch.name="name" sch.type="AAA" sch.comments="" sch.schoolID="00" student.grade="00"/> 
       <student sch.number="1234" sch.name="name" sch.type="AAA" sch.comments="Middle" sch.schoolID="00" student.grade="00"/> 
       <student sch.number="1234" sch.name="name" sch.type="AAA" sch.comments="" sch.schoolID="00" student.grade="00"/> 
      </group> 
     </Extract> 
    </ExportWizard> 
</campusRoot> 

Я пытаюсь получить данные студентов в кадр данных с именами столбцов «sch.number», «sch.name», «sch.type», «sch.comments», «сч. schoolID "и" student.grade ". Я попытался использовать следующий код для извлечения данных студента.

data <- xmlParse("xmlfile.xml", useInternalNodes = FALSE) 
root <- xmlRoot(data) 

После этого я могу перейти к первой строке данных с помощью этого кода.

root[[2]][[2]][[1]][[1]] 

Когда я пытаюсь получить значения для каждой строки с помощью функции xmlValue(), я не получаю значения обратно.

> xmlValue(root[[2]][[2]][[1]][[1]]) 
character(0) 

Я не уверен, как я должен прокручивать данные, чтобы я мог извлечь данные в фрейм данных. Я попытался посмотреть другие примеры, но не могу найти пример, где данные находятся внутри тега. Большинство примеров показывают данные между двумя тегами. Любые предложения о том, что я должен делать?

Я хотел бы, результат будет следующий кадр данных:

sch.number sch.name sch.type sch.comments sch.schooID student.grade 
1234  name  AAA  NA   00   00 
1234  name  AAA  NA   00   00 
1234  name  AAA  NA   00   00 
1234  name  AAA  NA   00   00 
1234  name  AAA  Middle  00   00 
1234  name  AAA  NA   00   00 
+0

Ваши узлы не имеют какой-либо текст в них так, что нет ничего для 'xmlValue' вернуться. Какие значения вы пытаетесь извлечь? Вы говорите об атрибутах? Какова ваша ожидаемая возвращаемая стоимость. – MrFlick

ответ

1

Вы не получаете значения с xmlValue, потому что узлы не имеют значения XML, информацию, вам нужно в атрибутах XML ,

Вы можете попробовать:

library(XML) 
data <- xmlParse(xml_data) 
res <- as.data.frame(do.call(rbind,xpathApply(data, "//student",xmlAttrs))) 
#or res <- as.data.frame(t(xpathSApply(data, "//student",xmlAttrs))) 
res 

xpathApply получит все student узлы и применить функцию xmlAttrs к каждому из них.

Выход:

sch.number sch.name sch.type sch.comments sch.schoolID student.grade 
1  1234  name  AAA      00   00 
2  1234  name  AAA      00   00 
3  1234  name  AAA      00   00 
4  1234  name  AAA      00   00 
5  1234  name  AAA  Middle   00   00 
6  1234  name  AAA      00   00 
+0

Я вижу, что вы имеете в виду. Я могу получить значения с помощью 'xmlAttrs()', но я получаю сообщение об ошибке при попытке запустить ваш код. 'Ошибка в UseMethod (" xpathApply "): Не применимый метод для 'xpathApply', примененный к объекту класса" c ('XMLDocument', 'XMLAbstractDocument') "' – nomoneyx

+0

Попробуйте удалить 'useInternalNodes = FALSE' из инструкции parse , Затем, если вы запустите 'class (data)', он должен быть 'XMLInternalDocument', а не' XMLDocument' и работать нормально. – NicE

+0

Спасибо за помощь, она отлично работает. – nomoneyx

Смежные вопросы