我在r和xml中比较新,所以可能有一个我找不到的明显答案。
我正在从xml文件中提取信息,并希望从具有相同名称的节点获取数据,但这些节点属于具有相同名称的不同父笔记。结构是这样的:
<CropSequenceClass>
<nameCropSequenceClass>
<Description> Name</Description>
<Units>-</Units>
<Name>nameCropSequenceClass</Name>
<Value>1</Value>
</nameCropSequenceClass>
<CropClass>
<name>
<Description>Crop name</Description>
<Units>-</Units>
<Name>name</Name>
<Value>Winter wheat3</Value>
</name>
</CropClass>
<CropClass>
<name>
<Description>Crop name</Description>
<Units>-</Units>
<Name>name</Name>
<Value>Winter wheat2</Value>
</name>
</CropClass>
</CropSequenceClass>
<CropSequenceClass>
<nameCropSequenceClass>
<Description> Name</Description>
<Units>-</Units>
<Name>nameCropSequenceClass</Name>
<Value>2</Value>
</nameCropSequenceClass>
<CropClass>
<name>
<Description>Crop name</Description>
<Units>-</Units>
<Name>name</Name>
<Value>Winter wheat4</Value>
</name>
</CropClass>
<CropClass>
<name>
<Description>Crop name</Description>
<Units>-</Units>
<Name>name</Name>
<Value>Winter wheat5</Value>
</name>
</CropClass>
</CropSequenceClass>
我可以使用getNodeSet获取所有四个'CropClass'节点并循环遍历它们,但是当我尝试根据父节点分割这些节点时,我遇到了障碍。 我尝试通过引用第一个'CropSequenceClass'节点集将第一个'CropClass'节点放到一个节点集中:
getNodeSet(doc, "//CropSequenceClass[1]/CropClass")
它有效,我有两个节点。 问题是,我想循环遍历这些'CropSequenceClass'节点以获取所有批次的'CropClass'节点(在此示例中为2 + 2),但如果我尝试下面的代码则不起作用:
k <- 1
getNodeSet(doc, "//CropSequenceClass[k]/CropClass")
我会使用此语法或解决方法来提供任何帮助。
答案 0 :(得分:1)
你非常接近。试试这个:
n <- length(doc["//CropSequenceClass"])
result <- lapply(1:n,function(i)doc[sprintf("//CropSequenceClass[%s]/CropClass",i)])
class(result[[1]])
# [1] "XMLNodeSet"
所以现在result
是XMLNodeSets
的列表。 result[[1]]
具有与第一个CropClass
等对应的CropSequenceClass
个节点,等等。