XPath для выбора всех, кроме общего элемента - PullRequest
0 голосов
/ 26 мая 2020

Допустим, у меня есть набор XML сообщений, каждое с общим заголовком, но с разными типами в противном случае:

<MessageType details="test">
    <MessageHeader>
        <HeaderContent>content</HeaderContent>
    </MessageHeader>
    <OtherStuff detail="test"/>
    <MessageContent>
        <MessageText>text</MessageText>
    </MessageContent>
</MessageType>
<MessageType2 details="test2">
    <MessageHeader>
        <HeaderContent>content2</HeaderContent>
    </MessageHeader>
    <MessageContent2>
        <MessageText2>text2</MessageText2>
    </MessageContent2>
</MessageType2>
<MessageType3 details="test3">
    <MessageHeader>
        <HeaderContent>content3</HeaderContent>
    </MessageHeader>
    <OtherStuff3 detail="test3"/>
    <MoreStuff3 detail="test3"/>
    <MessageContent3>
        <MessageText3>text3</MessageText3>
        <AnotherElement><Test text="">text3</Test></AnotherElement>
    </MessageContent3>
</MessageType3>

Мне нужен xpath, который выберет все, кроме MessageHeader и элемент root (поскольку он содержит MessageHeader).

//*[not(self::MessageHeader)] выберет все, кроме MessageHeader, но он также выберет элемент root, который я не хочу do.

Я бы также согласился на то, что выбирает всех братьев и сестер MessageHeader, потому что я думаю, что в моем случае это в основном делает то же самое

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Другой вариант для «xpath, который выберет все, кроме MessageHeader и root элемента»:

//*[not(count(ancestor::*)=0) and not(self::MessageHeader)]
1 голос
/ 26 мая 2020

Я бы также согласился на то, что выбирает всех братьев и сестер MessageHeader

Это будет /*/MessageHeader/following-sibling::*

Но вы также можете это сделать (в XPath 3.0) tail(/*/*) или в XPath 1.0 (/*/*)[position ()!= 1].

Примечание: если вы используете //*, вы выбираете элементы глубже в дереве, включая, например, HeaderContent. Я думаю, вам, вероятно, лучше выбрать только элементы уровня 2 (дочерние элементы самого внешнего элемента), потому что вы всегда можете перемещаться вниз от них, если вам нужно. В отличие от //*, /*/* выбирает только элементы уровня 2.

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