2013-03-28 3 views
1

У меня есть следующий XML-файл, в котором одни и те же узлы повторяются внутри файла, и мне нужно будет получить значения/свойства «console & int», например.Как разобрать странный XML-файл с помощью Nokogiri?

Любая идея, как я мог восстановить родительский элемент 'config' для 'console & int', чтобы я мог после get/values ​​/ property? У меня возникла проблема: «console» и «int» находятся на одном уровне, поэтому я не знаю:

  1. Как запросить для 'type = console' и 'env = int' одновременно?
  2. Как получить родителя после того, как я найду эти конкретные узлы? поэтому затем можно получить «values ​​/ property» после правильного родительского узла «config»?

XML, мы должны работать с это:

<server> 
    <propertySets> 
    <config> 
    <type>console</type> 
    <env>int</env> 
    <values> 
     <property name="a">a</property> 
     <property name="b">b</property> 
    </values> 
    </config> 

    <config> 
    <type>console</type> 
    <env>test</env> 
    <values> 
     <property name="c">c</property> 
     <property name="d">d</property> 
    </values> 
    </config> 

    <config> 
    <type>embedded</type> 
    <env>int</env> 
    <values> 
     <property name="f">f</property> 
     <property name="g">g</property> 
    </values> 
    </config> 
</propertySets> 
</server> 
+1

Есть ли корневой узел? Это не является хорошо сформированным XML-документом в противном случае, что затрудняет задачу –

+0

Просто проверено, да, эти узлы находятся под «server> propertySets». Я изменил XML в сообщении, чтобы отобразить всю структуру ... – mickael

ответ

2

xpath очень гибок; Вы можете делать то, что хотите напрямую, с запросом XPath:

xml = Nokogiri::XML::Document.parse(File.open('configs.xml')) 
xml.xpath('/server/propertySets/config[type="console" and env="int"]/values/property[@name="a"]').text 

Вам не нужно делать все за один раз. xpath результат в любой момент это все, что соответствует этому аксессор, так что вы можете получить выбранный конфигурационный блок, как это:

selected_config = xml.xpath('/server/propertySets/config[type="console" and env="int"]') 

, а затем принести значение вы заинтересованы в:

property_a_value = selected_config.xpath('values/property[@name="a"]').text 

Результаты из xpath сохраняют свой контекст в основном документе, поэтому вы можете даже продлить резервную копию от selected_config, чтобы запросить следующий материал для сестер и т. д.

+0

Ницца, большое спасибо Нейл !!! Я не знал, что вы можете просто сделать это ... type = "console" и env = "int". Спасибо за объяснение! – mickael

+0

Подумайте о результатах поиска ',' xpath' и 'css', как о массивах указателей или двойных списков в узлах в DOM. Вот почему они могут быть использованы для поиска вверх и вниз в иерархии и почему мы можем отделить их и переместить их, а их «дети» двигаться вместе с ними. –

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