2013-02-28 2 views
0

Я ищу строку XPath (для VBA Excel), которая может искать все узлы определенного уровня и которые возвращаются только в том случае, если они имеют конкретный (большой) дочерний узел. Независимо от того, как «глубоко» это вложен. Relationale: Я не знаю, насколько глубокий определенный ребенок вложен, поэтому я не могу сделать фиксированный путь.XML-выбор родительского элемента на основе дочернего элемента и/или внука с определенными атрибутами

В случае примера ниже. Я ищу все узлы, которые находятся непосредственно под корнем '', и которые имеют любой дочерний элемент, который содержит имя «Test», но этот ребенок не может содержать функцию «10». Однако функция '10' может быть доступен на более высоких уровнях


XML STRING:

<Program> 
    <AA name="1" function="01"/> 
    <BB name="2" function="10"> 
     <CC name="Test" function="01"/> 
    </BB> 
    <DD name="Test" function="05"/> 
    <EE name="3" function="01"> 
     <FF name="4" function="05"> 
     <GG name="Test" function="10"/> 
     </FF> 
    </EE> 
</Program> 


ТРЕБУЕТСЯ ВЫБОР:

Item(0) = <BB name="2" function="10"> 
Item(1) = <DD name="Test" function="05"> 


Следующее выражение XPath дает узлы под Program которые содержат название «Тест»

xmlDoc.selectNodes("/Program/*[.//@name='Test']") 


Как я могу выбирать ребенка на основе 'функции'

ответ

0

Вы были близки! Не должно было так легко отказаться!

//*[@name='Test' and @function !='10'] 

Или прямо из <Program>: /Program//*[@name='Test' and @function !='10']

Update:

/Program/*[@name='Test' and @function !='10' or .//*[@name='Test' and @function!='10']] 
+0

Здравствуйте JWiley, это не совсем ответ мне нужно. Эта функция вернет и

, но мне нужны и
, так что узлы непосредственно под корнем (этот вопрос только для принципа, действительная функция сложнее). У функции, которую у меня есть, есть ,
и , но это последнее, что мне нужно отфильтровать –

+0

Ах, извините, неправильно прочитайте вопрос. Я скоро обновлю ... – JWiley

+0

Благодаря триггеру JWiley я нашел полный код. Мне не хватало * [...] в моем коде. Таким образом, полная формула выглядит так. xmlDoc.selectNodes ("/ Программа /*[.//*[@ имя = 'Test' и @function! = '10']]") Спасибо за триггером –

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