xpath - 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
,因为我认为在我的情况下基本上做同样的事情
解决方案
我也会满足于选择 MessageHeader 的所有兄弟姐妹的东西
那将是/*/MessageHeader/following-sibling::*
但是您也可以(在 XPath 3.0 中)tail(/*/*)
或在 XPath 1.0 中这样做(/*/*)[position ()!= 1]
。
注意:如果您使用//*
,您将选择树中更深的元素,例如HeaderContent
. 我认为您最好只选择 2 级元素(最外层元素的子元素),因为如果需要,您始终可以从这些元素向下导航。与 不同//*
,/*/*
仅选择 2 级元素。
推荐阅读
- python - 需要在 Python 中将嵌套列表合并为单个列表
- spring - 如何使用 spring 集成测试按顺序运行控制器测试类
- php - 如何在 ArrayObject 类中获取项目索引
- react-native - react-native中多行文本中断后如何确定“更多”链接/按钮的位置
- javascript - php ajax 实时更新与批量更新
- sql-server - 如何获取提交“组件”的最新记录
- apache-spark-sql - 如何将 spark dataframe[double, String] 转换为 LabeledPoint?
- ios - 加载失败,错误域=NSURLErrorDomain 代码=-999
- python - Selenium Webdriver with Python - 无法在使用 Selenium Web 驱动程序的 Web 应用程序中提供输入(日期)
- javascript - 如何为多个折叠制作动态状态