首页 > 解决方案 > 识别 xml 文件的唯一属性

问题描述

我需要识别 xml 文件的所有唯一属性以正确地将 xml 转换为数据框。

以下 R 脚本允许进行转换。但前提是属性是已知的。

library(rvest)
library(magrittr)
xml <- read_xml('<?xml version="1.0" encoding="UTF-8"?>
            <movies>
              <movie Id="1" Name="Movie 1" IMDB="8,4" Date="2008-07-31T00:00:00.000" Views="649" />
              <movie Id="2" Name="Movie 2" IMDB="3,7" Location="El Cerrito, CA" Actor="Tom Hanks" />
            </movies>')

movies <- xml %>% xml_nodes("movie")
data.frame(
  Id = movies %>% xml_attr("Id"),
  Name = movies %>% xml_attr("Name"),
  IMDB = movies %>% xml_attr("IMDB"),
  Date = movies %>% xml_attr("Date"),
  Views = movies %>% xml_attr("Views"),
  Location = movies %>% xml_attr("Location"), 
  Actor = movies %>% xml_attr("Actor")
)  

输出将如下所示:

  Id    Name IMDB                    Date Views       Location     Actor
1  1 Movie 1  8,4 2008-07-31T00:00:00.000   649           <NA>      <NA>
2  2 Movie 2  3,7                    <NA>  <NA> El Cerrito, CA Tom Hanks

如何获得所有唯一属性的列表(实际数据太长,无法手动检查)?

对于此示例,所需的输出应类似于以下列表:

[1] "Id"
[2] "Name"
[3] "IMDB"
[4] "Date"
[5] "Views"
[6] "Location"
[7] "Actor"

标签: rxml

解决方案


使用您的数据:

Sample = '<?xml version="1.0" encoding="UTF-8"?>
            <movies>
              <movie Id="1" Name="Movie 1" IMDB="8,4" Date="2008-07-31T00:00:00.000" Views="649" />
              <movie Id="2" Name="Movie 2" IMDB="3,7" Location="El Cerrito, CA" Actor="Tom Hanks" />
            </movies>'

您可以从包和正则表达式str_extract_all中获得您想要的大部分内容。stringr至少正如我所做的那样,您需要清理虚假的 = 符号,然后使用unique它来消除重复项。

unique(sub("=", "", str_extract_all(Sample, "\\w+=")[[1]]))
[1] "version"  "encoding" "Id"       "Name"     "IMDB"     "Date"     "Views"   
[8] "Location" "Actor"

如果您不想在标题中包含“编码”标签,您可以运行

Sample = sub(".*(<movies.*?</movies>).*", "\\1", Sample)

首先只选择有电影的部分。


推荐阅读