微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml – 使用平面结构中的xpath导航到节点

我有一个扁平结构的xml文件.我们不控制这个xml文件的格式,只需要处理它.我已经重命名了这些字段,因为它们是高度特定于域的,并没有对问题产生任何影响.

<attribute name="Title">Book A</attribute>
<attribute name="Code">1</attribute>
<attribute name="Author">
   <value>James Berry</value>
   <value>John Smith</value>
</attribute>
<attribute name="Title">Book B</attribute>
<attribute name="Code">2</attribute>
<attribute name="Title">Book C</attribute>
<attribute name="Code">3</attribute>
<attribute name="Author">
    <value>James Berry</value>
</attribute>

需要注意的关键事项:文件不是特别分层的.书籍由name =’Title’的属性元素的出现界定.但name =’Author’属性节点是可选的.

是否有一个简单的xpath语句,我可以用它来找到书’n’的作者?很容易识别书籍’n’的标题,但作者的价值是可选的.你不能只考虑以下作者,因为在第2册的情况下,这将给作者第3册.

我已经编写了一个状态机来解析它作为一系列元素,但我不禁想到会有一种直接获得我想要的结果的方法.

解决方法

我们希望@name’Partner’的“attribute”元素遵循@name’Title’的“attribute”元素,其值为’Book n’,而@name’Title’之间没有任何其他“attribute”元素他们(因为如果有,那么作者撰写了其他一些书).

换句话说,这意味着我们想要一个作者,其中第一个前面的标题(它“属于”的标题)是我们正在寻找的标题

//attribute[@name='Author']
[preceding-sibling::attribute[@name='Title'][1][contains(.,'Book N')]]

N = C =>发现< attribute name =“作者”>< value> James Berry< / value>< / attribute>

N = B =>一无所获

使用XSLT 2.0中提供的键和/或分组功能可以使这更容易(如果文件很大,也会更快).

(SO代码解析器似乎认为’//’代表’评论’,但在XPath中它不是!!!叹息.)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。