首页 > 解决方案 > XPath 选择除公共元素之外的所有元素

问题描述

假设我有一组 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除根元素之外的所有内容(因为它包含MessageHeader)。

//*[not(self::MessageHeader)]将选择除 之外的所有内容MessageHeader,但它也会选择我不希望它执行的根元素。

我也会满足于选择所有兄弟姐妹的东西MessageHeader,因为我认为在我的情况下基本上做同样的事情

标签: xpath

解决方案


我也会满足于选择 MessageHeader 的所有兄弟姐妹的东西

那将是/*/MessageHeader/following-sibling::*

但是您也可以(在 XPath 3.0 中)tail(/*/*)或在 XPath 1.0 中这样做(/*/*)[position ()!= 1]

注意:如果您使用//*,您将选择树中更深的元素,例如HeaderContent. 我认为您最好只选择 2 级元素(最外层元素的子元素),因为如果需要,您始终可以从这些元素向下导航。与 不同//*/*/*仅选择 2 级元素。


推荐阅读