如何用r在xml中创建一个双循环

时间:2014-12-19 20:07:19

标签: xml r

我在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")

我会使用此语法或解决方法来提供任何帮助。

1 个答案:

答案 0 :(得分:1)

你非常接近。试试这个:

n <- length(doc["//CropSequenceClass"])
result <- lapply(1:n,function(i)doc[sprintf("//CropSequenceClass[%s]/CropClass",i)])
class(result[[1]])
# [1] "XMLNodeSet"

所以现在resultXMLNodeSets的列表。 result[[1]]具有与第一个CropClass等对应的CropSequenceClass个节点,等等。