【问题标题】:parsing xml to list in R: how to consistently access nodes when xml structure varies?解析 xml 以在 R 中列出:当 xml 结构变化时如何一致地访问节点?
【发布时间】:2011-03-24 20:03:57
【问题描述】:

背景

我有一个 xml 设置文件,看起来像这样:

<level1>
 <level2>
   <level3>
    <level4name>bob</level4name>
   </level3>
 </level2>
</level1>

level3可以有多个实例

<level1>
 <level2>
   <level3>
    <level4name>bob</level4name> 
   </level3>
   <level3>
    <level4name>jack</level4name> 
   </level3>
   <level3>
    <level4name>jill</level4name> 
   </level3>
 </level2>
</level1>

每个level3也可以有多种类型的level4节点:

   <level3>
    <level4name>bob</level4name> 
    <level4dir>/home/bob/ </level4dir> 
    <level4logical>TRUE</level4logical> 
   </level3>

在 R 中,我使用

加载此文件
settings.xml <- xmlTreeParse(settings.file)
settings <- xmlToList(settings.xml)

我想编写一个脚本,将level4type1 中包含的所有值转换为此级别的唯一值向量,但我很难以适用于上述所有情况的方式执行此操作.

其中一个问题是class(settings[['level2']]) 是前两种情况的列表和第三种情况的矩阵。

> xmlToList(xmlTreeParse('case1.xml'))
$level2.level3.level4name
[1] "bob"
> xmlToList(xmlTreeParse('case2.xml'))
                  level2
level3.level4name "bob" 
level3.level4name "jack"
level3.level4name "jill"
> xmlToList(xmlTreeParse('case3.xml'))
       level2
level3 List,3
level3 List,1
level3 List,1

问题

我有两个问题:

  1. 如何提取 'level4type1` 的唯一值的向量

  2. 有没有更好的方法来做到这一点?

【问题讨论】:

  • 我已经提交了issue on GitHub。此问题链接到 xmlToList 的替代实现,它不会表现出此行为(但可能包含其他问题)。

标签: xml r settings


【解决方案1】:

尝试使用XML的内部节点表示和xpath语言,非常强大。

> xml = xmlTreeParse("case2.xml", useInternalNodes=TRUE)
> xpathApply(xml, "//level4name", xmlValue)
[[1]]
[1] "bob"

[[2]]
[1] "jack"

[[3]]
[1] "jill"

【讨论】:

  • 感谢@Martin,这几乎就是我想要的,但我还有两个问题:如果节点不在同一行,R 返回“\n bob \n”,是有一个简单的方法吗?除了使用unlist之外,有没有办法让函数返回一个向量?
  • xpath 有string functions 用于转换; normalize-space 去除前导/尾随空格。 this 提供了提示,但我认为除了迭代解决方案之外,您可能不太走运。返回向量请参见?xpathSApply
  • @David 实际上,sapply(getNodeSet(xml, "//level4name"), xpathApply, "normalize-space()") 首先获取节点,然后对每个节点的空间进行规范化。
  • +1 因为这一行解决了我在可预见的未来的所有解析需求!
猜你喜欢
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多