2015-10-28 1 views
1

У меня есть файл XML, сказать:Поиск специальный дочерний узел, используя его atrribute с findnodes

<root_node + attribute> 
    <child_node1 + attribute> 
     <node1_2 + attribute> 
     <node1_3> 
      <node1_4 + attribute> 
       TEXT COME HERE 
      </node1_4> 
     </node1_3> 
     </node1_2> 
    </child_node1> 
    <child_node2 + attribute> 
     <node2_2 + attribute> 
     <node2_3> 
      <node2_4 + attribute> 
       TEXT COME HERE 
      </node2_4> 
     </node2_3> 
     </node2_2> 
    </child_node2> 
    <child_node3 + attribute> 
     <node3_2 + attribute> 
     <node3_3> 
      <node3_4 + attribute> 
       TEXT COME HERE 
      </node3_4> 
     </node3_3> 
     </node3_2> 
    </child_node3> 
</root_node3> 

Как вы видите, есть много дочерних узлов с различными атрибутами. Чтобы сэкономить время, я хочу найти специальный узел, используя его атрибут, который я знаю заранее, и я хочу использовать его внутренние узлы.

Например, в приведенном выше XML-файле я ищу child_node2 с его атрибутом, а затем хочу сохранить атрибут node2_4 в переменной.

Моя проблема только в том, чтобы знать, как я иду прямо на нужный узел (здесь child_node2), а затем сохранить атрибут его внука.

Надеюсь, это объясняет мою проблему четко.

+0

Это не реально - ваш XML не является действительным. Атрибуты представляют собой пары ключ-значение: 'myatt =" somevalue "'. Вы также не объясните, что вы пытаетесь выбраться из приведенного выше примера. – Sobrique

ответ

1

Если у вас есть что-то вроде <child_node myatt="some_value"> то синтаксис для xpath является:

findnodes('//child_node[@my_att]') # find all with this attribute. 
findnodes('//child_node[@my_att="some_value"]') #find this specific instance. 

Вы можете Шлейфовое findnodes, хотя, чтобы найти в рамках существующих критериев отбора:

foreach my $element ($xml -> findnodes('//child_node[@my_att="some_value"]')) { 
    $element -> findnodes('//node2_4[@attribute="value"]'); #within this 
} 

I не может быть более конкретным, к сожалению, потому что ваш образец XML недействителен, и вы точно не указываете, какой «бит» вы хотите извлечь из него.

Вы можете также составные элементы: XPath

//child_node[@my_att="some_value"]/somechild/someotherchild[@fish_att] 
+0

Большое спасибо за ваш ответ. –

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