R解析plist XML

Posted

技术标签:

【中文标题】R解析plist XML【英文标题】:R parsing plist XML 【发布时间】:2018-03-26 15:51:55 【问题描述】:

抱歉,修改了一点细微差别!在我提供的示例中,我对原始文件进行了过多的简化,因此尽管您的解决方案按原样工作得很好,但如果在第二行中添加了一些额外的东西怎么办?那些似乎抛弃了 xml_find_all(page, "//event"),因为现在它找不到那个节点。我怎样才能让脚本忽略额外内容(或者可能是什么是正确的搜索词来合并它们?)谢谢!!!

我是使用 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

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

我更喜欢使用 xml2 库而不是 xml 库。 这是一个非常直接的问题。读入数据,解析出所需的属性和节点,组装成一个数据框。

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<- xml_attr(xml_find_first(nodes, ".//section"), "name")
Speaker<- xml_attr(xml_find_first(nodes, ".//person"), "id")
SpeakerType<- xml_attr(xml_find_first(nodes, ".//person"), "type")
SpeakerName<- xml_text(xml_find_first(nodes, ".//person")) 
Body<- xml_text(xml_find_first(nodes, ".//plist/p"))  

#put together into a data.frame
answer<-data.frame(Section, Speaker, SpeakerType, SpeakerName, Body)

代码被设置为解析一系列“事件”节点。为清楚起见,我使用 5 个步骤分别解析出每个请求的信息字段,然后合并到最终的数据帧中。 这样做的部分理由是在“事件”节点丢失某些请求信息的情况下保持对齐。这可以简化,但如果您的数据集很小,则不会对性能产生太大影响。

【讨论】:

这很好用,但我的错,我想我过分简化了我的例子。我在原始问题中进行了编辑,问题似乎是 xml 的事件部分中的额外信息位,因此 nodes 是的,它看起来像定义了一个命名空间。我通常处理这个问题的方法是在 xml2 包中使用 xml_ns_strp() 函数去除命名空间。 啊,好吧,就是这些。喜欢 xml2 包!

以上是关于R解析plist XML的主要内容,如果未能解决你的问题,请参考以下文章

Racket 中的 Plist/XML 解析

android Plist解析器xml资产

android plist解析器

C++ 解析二进制 plist

使用 XML 包 R 解析 RSS 提要

R中的XML解析 - 子节点属性的递归体面