抱歉,编辑的还有一点点细微差别!在我提供的示例中,我已经简化了我的原始文件,所以尽管你的解决方案工作得非常漂亮,但是如果在第二行中有一些额外的东西怎么办?那些似乎抛弃了xml_find_all(页面," //事件"),因为现在它无法找到该节点。我怎样才能让脚本忽略额外内容(或者可能是合适的搜索词包含哪些内容?)谢谢!!!
我刚开始使用xml,我有一些语音xml文件,我试图在R中压缩成数据帧,但我无法使用某些文件来读取它们。 XML包中的标准函数。我认为问题是plist格式,因为我尝试应用的其他一些答案都不适用于这些文件。
我的文件如下所示(*****第二行编辑):
<?xml version="1.0" encoding="us-ascii"?>
<event id="111" extraInfo="CivilwarSpeeches" xmlns = "someurl>
<meta>
<title>Gettysburg</title>
<date>1863-11-19</date>
<organizations>
<org>Union</org>
</organizations>
<people>
<person id="0" type="President">Honest Abe</person>
</people>
</meta>
<body>
<section name="Address">
<speaker id="0">
<plist>
<p>Four score and seven years ago</p>
</plist>
</speaker>
</section>
</body>
</event>
我想最终得到一个数据框,它链接了两个部分中的一些信息,例如
部分|扬声器|扬声器类型|演讲者姓名|正文
地址| 0 |总统|诚实的安倍|四分七年前
我发现这个答案相当有用,但它仍然无法解压缩我的数据。 Parsing XML file with known structure and repeating elements
任何帮助将不胜感激!
答案 0 :(得分:0)
我更喜欢在xml库上使用xml2
库
这是一个非常直接的问题。读入数据,解析出所需的属性和节点,然后组装成数据框。
library(xml2)
page<-read_xml('<?xml version="1.0" encoding="us-ascii"?>
<event id="111">
<meta>
<title>Gettysburg</title>
<date>1863-11-19</date>
<organizations>
<org>Union</org>
</organizations>
<people>
<person id="0" type="President">Honest Abe</person>
</people>
</meta>
<body>
<section name="Address">
<speaker id="0">
<plist>
<p>Four score and seven years ago</p>
</plist> </speaker> </section> </body> </event>')
#get the nodes
nodes<-xml_find_all(page, "//event")
#parse the requested information out of each node
Section<-sapply(nodes, function(x) {xml_attr(xml_find_first(x, ".//section"), "name")})
Speaker<-sapply(nodes, function(x) {xml_attr(xml_find_first(x, ".//person"), "id")})
SpeakerType<-sapply(nodes, function(x) {xml_attr(xml_find_first(x, ".//person"), "type")})
SpeakerName<-sapply(nodes, function(x) {xml_text(xml_find_first(x, ".//person"))})
Body<-sapply(nodes, function(x) {xml_text(xml_find_first(x, ".//plist/p"))})
#put together into a data.frame
answer<-data.frame(Section, Speaker, SpeakerType, SpeakerName, Body)
代码设置为解析一系列“事件”节点。为清楚起见,我使用5个单独的sapply函数来单独解析每个请求的信息字段,然后组合成最终的数据帧。对此的部分理由是在“事件”节点缺少一些所请求的信息的情况下保持对齐。这可以简化,但如果您的数据集很小,则不会对性能产生太大影响。