XPath: узлы, у которых есть дочерний узел с атрибутом - PullRequest
3 голосов
/ 18 мая 2010

Фрагмент XML

    <component name='Stipulations'>
        <group name='NoStipulations' required='N'>
            <field name='StipulationType' required='N' />
            <field name='StipulationValue' required='N' />
        </group>
    </component>
    <component name='NestedParties3'>
        <group name='NoNested3PartyIDs' required='N'>
            <field name='Nested3PartyID' required='N' />
            <field name='Nested3PartyIDSource' required='N' />
            <field name='Nested3PartyRole' required='N' />
            <group name='NoNested3PartySubIDs' required='N'>
                <field name='Nested3PartySubID' required='N' />
                <field name='Nested3PartySubIDType' required='N' />
            </group>
        </group>
    </component>
    <component name='UnderlyingStipulations'>
        <group name='NoUnderlyingStips' required='N'>
            <field name='UnderlyingStipType' required='N' />
            <field name='UnderlyingStipValue' required='N' />
        </group>
    </component>

Я хочу, чтобы все "групповые" узлы имели дочерний узел типа "field" и имя "StipulationType".

Это то, что я пробовал до сих пор:

dictionary.XPathSelectElements("group[field[@name='StipulationType']]")
dictionary.XPathSelectElements("group[./field[@name='StipulationType']]")

Ответы [ 2 ]

2 голосов
/ 18 мая 2010

выглядит хорошо. Возможно, вам потребуется немного конкретизировать XPath в зависимости от реализации:

//group[field[@name='StipulationType']]

или

/component/group[field[@name='StipulationType']]

должно работать

1 голос
/ 18 мая 2010

Проблема:

dictionary.XPathSelectElements("group[field[@name='StipulationType']]")

Это выбирает все элементы группы, удовлетворяющие предикату, , которые являются дочерними элементами текущего узла .

Однако вам нужны все элементы группы (удовлетворяющие предикату) - из фрагмента XML ясно видно, что не все элементы группы имеют одного и того же родителя.

Решение :

Оцените выражение XPath от прародителя (на основе предоставленного фрагмента!):

Один из примеров:

component/group[field[@name='StipulationType']] 

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

Чего следует избегать:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...