使用 R 读取 XML 时遇到问题
Having trouble reading XML with R
我正在使用最新版本的 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
您没有获得 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
我正在使用最新版本的 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
您没有获得 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