【问题标题】:Separating Values returned from xpathSApply分离从 xpathSApply 返回的值
【发布时间】:2016-01-26 16:31:13
【问题描述】:

我在下面有一些示例 XML 数据:

xml.sample <-'<?xml version="1.0" encoding="utf-8"?>
<Production>
<Item>
<ItemNr>1</ItemNr>
<Category>Processing</Category>
<Processed>
<Dia>325</Dia>
<Log>
<LogKey>1</LogKey>
</Log>
<Log>
<LogKey>2</LogKey>
</Log>
</Processed>
</Item>
<Item>
<ItemNr>2</ItemNr>
<Category>NoProcessing</Category>
<NotProcessed>
<Dia>72</Dia>
</NotProcessed>
</Item>
<Item>
<ItemNr>3</ItemNr>
<Category>Processing</Category>
<Processed>
<Dia>95</Dia>
<Dia>100</Dia>
<Log>
<LogKey>1</LogKey> %>% 
</Log>
</Processed>
</Item>
</Production>'

我读入并尝试运行以下代码:

doc <- xmlTreeParse(xml.sample, useInternalNodes = T)
root <- xmlRoot(doc)

xpathSApply(root, "//Item/Processed/Dia", xmlValue)

它返回以下内容:

"325" "95"  "100"

我想要的以下格式是,对于每个&lt;Item&gt; 节点,找到一个&lt;Dia&gt; 标记,将与该&lt;Item&gt; 节点相关的所有&lt;Dia&gt; 值存储到列表的一部分中。

理想情况下是这样的:

dia.list <- vector("list", 2)
[[1]]
[1] "325"

[[2]]
[1] "95"  "100"

但是,问题在于 xpathSApply,它连接了所有满足给定 Xpath 的值,因此您无法区分哪些值来自哪个节点。

对此的任何帮助将不胜感激:)

【问题讨论】:

    标签: xml r xpath xml-parsing


    【解决方案1】:

    doc 开始(根本不使用根节点),您可以先使用[.XMLNode 便利访问器进入“已处理”节点。这将节点分成一个列表。然后我们可以从中得到分离的值。

    lapply(doc["//Item/Processed"], function(x) {
        if(!length(x <- x["Dia"])) NA else sapply(unname(x), xmlValue)
    })
    # [[1]]
    # [1] "325"
    #
    # [[2]]
    # [1] "95"  "100"
    

    更新:对于没有“Dia”节点的情况,编辑后的代码将生成NA

    【讨论】:

    • 我忘了把这个添加到我的问题中,但是对于没有&lt;Dia&gt; 的值或根本没有&lt;Dia&gt; 标签的情况,你如何将NA 插入到该位置使用您的功能列出?
    猜你喜欢
    • 2019-05-22
    • 2020-07-31
    • 1970-01-01
    • 2019-01-10
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多