从XML提取文本,但是文件具有重复的节点名

三角旗

我试图从XML文件导入一些数据到R data.frame。虽然我对R有相当的经验,但我以前从未使用过XML,所以对我而言这一切都是新事物,我感到有些迷茫。

下面提供了XML示例:

<ArchivedIncident ID="100">
    <attributes>
        <entry>
            <key>TEST1</key>
            <value>
                <type>S</type>
                <value/>
            </value>
        </entry>
        <entry>
            <key>TEST2</key>
            <value>
                <type>S</type>
                <value>12</value>
            </value>
        </entry>
        <entry>
            <key>TEST3</key>
            <value>
                <type>T</type>
                <value>A</value>
            </value>
        </entry>
        <entry>
            <key>TEST4</key>
            <value>
                <type>S</type>
                <value/>
            </value>
        </entry>
    </attributes>
</ArchivedIncident>
<ArchivedIncident ID="101">
    <attributes>
        <entry>
            <key>TEST1</key>
            <value>
                <type>S</type>
                <value>BLAH</value>
            </value>
        </entry>
        <entry>
            <key>TEST2</key>
            <value>
                <type>S</type>
                <value/>
            </value>
        </entry>
        <entry>
            <key>TEST3</key>
            <value>
                <type>T</type>
                <value/>
            </value>
        </entry>
        <entry>
            <key>TEST4</key>
            <value>
                <type>S</type>
                <value/>
            </value>
        </entry>
    </attributes>
</ArchivedIncident>

我想完成的是一个R-data.frame,看起来像这样:

ID     TEST1    TEST2    TEST3    TEST4
100    NA       12       A        NA
101    BLAH     NA       NA       NA

到目前为止,我想出了什么:

使用xml2包,我可以使用以下命令读取ID:

require(xml2)
doc <- read_xml("./data/file.xml")
df <- data.frame( 
  ID = xml_attr( xml_find_all( doc, ".//ArchivedIncident" ), "ID" )
  )

到目前为止,一切都很好,但是现在我迷失了如何提取其余部分。有多个节点,都命名为“ entry”,“ value”和“ type”。如何从中提取文本(用作列名)和该键的值(其后的内容)。

复杂的因素是,并非每个人都有价值。我想为空值插入一个“ NA”。在另一种情况下,我可以为此使用自定义函数,但是我不确定(因为我不知道如何提取正确的文本)是否可以在这里使用。

L <- xml_find_all(doc, ".//ArchivedIncident")
FindAllValues <- function(node){
    tmp <- lapply(L, xml_find_all, paste0(".//", node))
    tmp <- lapply(tmp, xml_text)
    tmp[!sapply(tmp, function(y) length(y == 0))] <- NA
    return(tmp)
}
hrbrmstr
library(xml2)
library(tidyverse)

doc <- read_xml("file.xml")

xml_find_all(doc, ".//ArchivedIncident") %>% # iterate over each incident
  map_df(~{
    set_names(
      xml_find_all(.x, ".//value/value") %>% xml_text(), # get entry values
      xml_find_all(.x, ".//key") %>% xml_text()          # get entry keys (column names)
    ) %>% 
      as.list() %>%                                      # turn named vector to list
      flatten_df() %>%                                   # and list to df
      mutate(ID = xml_attr(.x, "ID"))                    # add id
  }) %>%
  type_convert() %>% # let R convert the values for you
  select(ID, everything()) # get it in the order you likely want
## # A tibble: 2 x 5
##      ID TEST1 TEST2 TEST3 TEST4
##   <int> <chr> <int> <chr> <chr>
## 1   100  <NA>    12     A  <NA>
## 2   101  BLAH    NA  <NA>  <NA>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将 xml 请求转换为具有重复节点名称的 json 请求

具有Unicode节点名称的XML的崇高配色方案

使用Golang进行XML编组-具有相同节点名称的多个节点

使用 XSLT 从任何 xml 中提取具有值的所有文本节点的 xpath

使用R为xml文件中的所有节点提取具有相同名称的属性

VBScript:使用重复的节点名称更新/修改XML文件-输入:TXT和XML-输出:XML

T-SQL查找具有匹配文本的节点,并从XML字段中的同级节点中提取值

用于从 XML 中提取节点名称的正确 PowerShell 语法

加入与PHP具有相同节点名的节点值

XSL:仅复制在大型XML文件中具有重复属性值的节点

使用XSLT进行XML转换以生成具有重复行的文本文件

如何解析具有重复节点的XML?

具有多个节点/子节点的sql导入xml文件

Shell脚本从XML文件检索节点名称

<:nodename>是有效的xml节点名称吗?

从具有重复条目名称的tar文件中提取

节点的Xpath没有文本,但是子节点有文本

如何在 XSLT 中访问具有动态节点名称的节点的子节点

XML遍历查找节点名

给定具有xpath的相邻节点的文本,获取XML节点的文本

如何使用javascript读取具有多个节点的xml文件

解析具有相同名称的子节点的XML文件

删除xml文件中具有特定值的子节点

具有自定义子节点的XML文件

使用python合并具有相同节点的XML文件

从 xml 节点集中提取文本

从Oracle中重复的节点中提取特定的xml节点

PHP 从嵌套的 XML 字符串中检索所有节点名称和节点值

从XML文件中提取文本