R中的XML:具有循环名称的多个子代

能够

我有一个XML文档,如下所示:

<root>
    <Item>
        <A>text1</A>
        <B>text2</B>
        <C>text3</C>
        <C>text4</C>
        <C>text5</C>
        <D>text6</D>
        ...
    </Item>
    <Item>
        ...
    </Item>
    ...
</root>

一个复杂的因素相对简单:每个因素item可以有任意数量的Cs。

最终,我希望将其放在一个表中,例如:

  A     B     C          D    
1 text1 text2 <list [3]> text6

我已经为其他变量创建了表格(可能是一种混乱的方式,但是它可以工作):

vnames<-c("A","B","D")
dat<-list()
for(i in 1:length(vnames)){
    dat[[i]]<-xml_text(xml_find_first(nodeset,paste0(".//d1:",vnames[[i]]),xml_ns(xmlfile)))
}
dat<-as.data.frame(dat,col.names=vnames)

但是,此方法仅在xml_find_first实际为您提供所需的一切时才起作用我可以使用xml_find_all,但这会使列表长度对于合并而言是不相等的。我有很长的Cs清单,但我不知道哪一个与哪个项目一起使用。

我当然可以通过每一个项目和循环xml_find_allCS,但似乎效率不高。有没有更简单的方法可以做到这一点?

抱歉,是否已经有人问过?我找不到 另外,我是XML的新手,因此可能需要一种全新的方法。谢谢!

戴夫2e

这是一个可能的解决方案,我不确定最终结果是否是您想要的。

如果所有数据仅下一层,则此方法效果很好。如果数据在xml中向下存储了多个级别,则需要扩展此解决方案。基本方法是解析所有Item节点。从每个项目节点中的所有子节点收集信息,然后通过计算每个项目中的孩子数来创建项目索引。然后将所有数据存储在3列数据框中:ItemIndex,子名称和值。从这里开始,要转换为所需的最终格式。

library(xml2)

page<-read_xml("<root>
    <Item>
        <A>text1</A>
        <B>text2</B>
        <C>text3</C>
        <C>text4</C>
        <C>text5</C>
        <D>text6</D>
    </Item>
    <Item>
        <A>text12</A>
        <B>text22</B>
        <C>text32</C>
    </Item>
</root>")

#find all items and store as a list
items<-xml_find_all(page, ".//Item")

#extract all children's names and values 
nodenames<-xml_name(xml_children(items))
contents<-trimws(xml_text(xml_children(items)))

#Need to create an index to associate the nodes/contents with each item
itemindex<-rep(1:length(items), times=sapply(items, function(x) {length(xml_children(x))}))

#store all information in data frame.
df<-data.frame(itemindex, nodenames, contents)

#Convert from long to wide format
library(tidyr)
pivot_wider(df, id_cols= itemindex, names_from = nodenames,
            values_from = contents)  # %>% unnest(cols = c(A, B, C, D))

# A tibble: 2 x 5
itemindex       A           B           C           D
<int> <list<fct>> <list<fct>> <list<fct>> <list<fct>>
    1         [1]         [1]         [3]         [1]
    2         [1]         [1]         [1]         [0]

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有CSS的多个子代子选择器

解析具有多个同名子代的xml子代,python

r中具有多个子行的表并写入pdf

解析具有多个子项的 xml

如何在SQL中拆分具有相同子代名称的两个xml标记

SQL Server XML查询:查询具有相同名称的多个子元素

在R中的for循环中创建具有更改名称的多个函数

fork(),有多个子代的问题

SKSpriteNode不能有多个子代

如何在 Python 中循环使用具有多个子键的 JSON 文件?

跟踪数组或迭代器中的每个子代均应具有唯一的“键”道具

ReactJS警告:数组或迭代器中的每个子代都应具有唯一的“键”属性

使用jsoup解析具有多个子对象的xml

具有多个子元素的SQL查询分层XML

查询具有多个子实体的XML

具有多个子节点的 Oracle XML 查询

python JSON dict检查是否有单个或多个子代

将具有相同标签的多个子元素添加到带有Python / Elementtree的XML树中

XPath选择多个子代中//和// descendant之间的区别

C中具有任意多个子节点的树节点

在具有多个循环的列表理解中未定义名称

警告:数组或迭代器中的每个子代都应具有唯一的“键”道具。检查`ListView`的渲染方法

反应警告:数组或迭代器中的每个子代均应具有唯一的“键”道具。检查ʻApp`的渲染方法

警告:数组或迭代器中的每个子代都应具有唯一的“键”道具。检查“ MovieResults”的渲染方法

数组或迭代器中的每个子代都应具有唯一的“键”道具(将Rails与React配合使用)

持续警告:“即使数组或迭代器中的每个子代都应具有唯一的'key'属性”

如何使用for循环在xslt中处理具有相同名称但属性值不同的xml标记

在熊猫中具有多个IF条件的循环

向量化具有多个条件的 for 循环,循环遍历 R 中的数据帧