【问题标题】:Having trouble reading XML with R使用 R 读取 XML 时遇到问题
【发布时间】:2015-10-19 09:57:36
【问题描述】:

我正在使用最新版本的 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.cmets”、“sch.schoolID”和“学生。年级”。我已经尝试使用以下代码来提取学生数据。

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

【问题讨论】:

  • 您的节点中没有任何文本,因此xmlValue 没有任何内容可返回。你想提取什么价值?你说的是属性吗?您的预期回报值是多少。

标签: xml r import


【解决方案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

【讨论】:

  • 我明白你的意思。我可以使用xmlAttrs() 获取值,但是当我尝试运行您的代码时出现错误。 Error in UseMethod("xpathApply") : no applicable method for 'xpathApply' applied to an object of class "c('XMLDocument', 'XMLAbstractDocument')"
  • 尝试从您的解析语句中删除useInternalNodes=FALSE。那么如果你运行 class(data) 它应该是 XMLInternalDocument 而不是 XMLDocument 并且运行良好。
  • 太好了,你也可以使用xpathSApply,它简化了结果而不是返回一个列表。我只是将其添加为答案中的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2013-04-10
  • 1970-01-01
  • 2015-05-19
  • 2017-01-08
  • 1970-01-01
  • 2017-12-04
相关资源
最近更新 更多