无法使用R读取XML

时间:2015-07-28 17:23:20

标签: xml r import

我正在使用最新版本的R,3.2.1和XML包来尝试读取xml文件并将其转换为数据框。我是xml的初学者,但对R有一点经验。我的xml文件格式如下。

<?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”,“sch.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

1 个答案:

答案 0 :(得分: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