2015-07-17 3 views
1

Есть ли способ использовать метод .getAttribute (или любой другой метод) в VBA для выбора только уникальных (не дублированных) атрибутов в объекте XMLDOMSelection?VBA захватывает уникальные атрибуты из дерева XML

Другими словами, у меня есть XML-документ, который имеет следующее:

<plants> 
    <plant color="green" height="7">Apple</plant> 
    <plant color="red" height="7">zztop</plant> 
    <plant color="red" height="8">42</plant> 
</plants> 

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

Как бы то ни было, я использую рекурсивный цикл для извлечения всех значений (дублируется также) и запускает финальную с помощью другой функции для удаления дубликатов. Однако проблема заключается в том, что это слишком дорого.

Пожалуйста, дайте мне знать ваши мысли, спасибо.

ответ

0

Если вы используете XPath 2.0:

distinct-values(/plants/plant/@color)

и XPath 1.0:

/plants/plant[not(@color = ../following-sibling::plant/@color)]/@color

1

Поскольку VBA поддерживает только XPath 1.0, вы должны быть в состоянии использовать этот XPath 1.0 выражение:

/plants/plant[not(@color = following-sibling::plant/@color)]/@color 

Предикат, используемый выше, ограничивает XPath возвращать только последнее вхождение того же color в случае их множественности. Обратите внимание, что нет необходимости подниматься до родительского узла текущего узла <plant> (используя ярлык ..) перед вызовом following-sibling::plant, потому что те узлы <plant> уже находятся на том же уровне.

+1

Nitpick: Это не * VBA *, который поддерживает XPath 1.0, это MSXML2. VBA поддерживает любой COM-модуль, который вы используете. – Tomalak