2014-12-19 1 views
2

Я относительно новый в r и xml, поэтому может быть очевидный ответ, который я не мог найти.как сделать двойную петлю в xml с r

Я извлекаю информацию из 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> 

я могу получить все четыре из узлов «CropClass» с getNodeSet и петлей через них, но я врезался в стену, когда я пытаюсь разделить эти узлы вверх в соответствии с их родительских узлов. я пытался получить только первые узлы «CropClass» в один набор узлов, обращаясь к первому набору узлов «CropSequenceClass», как это:

getNodeSet(doc, "//CropSequenceClass[1]/CropClass") 

Он работал, я получил два узла. Проблема в том, что я хотел бы пропустить эти узлы CropSequenceClass, чтобы получить все партии узлов CropClass (в этом примере 2 + 2), но если я попробую код ниже, это не сработает:

k <- 1 
getNodeSet(doc, "//CropSequenceClass[k]/CropClass") 

Я бы мог воспользоваться любой помощью, используя этот синтаксис или обходной путь.

ответ

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 и т. Д.

Смежные вопросы