使用前面和后面约束XPath兄弟关系

时间:2015-09-22 03:57:50

标签: xml xpath siblings

我需要了解如何创建一个XPath,只返回root_level元素的id值,其值为2,紧跟在root_level 1值之后。我花了几个小时在网站上查看之前对类似帖子的回复,但他们没有遇到我遇到的相同类型的限制。

以下是一个示例XML代码段。它们可以更长:

<?xml version="1.0" encoding="UTF-8"?>
    <result>
            <item>
                <id>659478</id>
                <name>Company A</name>
                <root_level>1</root_level>
                </item>
            <item>
                <id>692557</id>
                <root_level>2</root_level>
            </item>
            <item>
                <id>659482</id>
                <root_level>2</root_level>
            </item>
            <item>
                <id>666534</id>
                <root_level>3</root_level>
            </item>
            <item>
                <id>665260</id>
                <root_level>3</root_level>
            </item>
            <item>
                <id>665773</id>
                <root_level>3</root_level>
            </item>
            <item>
                <id>635003</id>
                <name>Company B</name>
                <root_level>1</root_level>
            </item>
            <item>
                <id>635005</id>
                <root_level>2</root_level>
            </item>
            <item>
                <id>635015</id>
                <root_level>2</root_level>
            </item>
            <item>
                <id>671626</id>
                <root_level>2</root_level>
            </item>
            <item>
                <id>584793</id>
                <name>Company C</name>
                <root_level>1</root_level>
            </item>
            <item>
                <id>623716</id>
                <root_level>2</root_level>
            </item>
            <item>
                <id>698585</id>
                <root_level>3</root_level>
            </item>
    </result>

我尝试了以下XPath的变体,但这需要始终知道下一个root_level 1名称。请注意,也可能没有以下root_level 3值。唯一的常量是root_level 1始终存在。

//item[root_level=2][preceding-sibling::item[name='Company A'] and following-sibling::item[name='Company B']]/id

此外,我被迫在我的解决方案中使用XPath 1.0。

如果有人可以指出我正确的方向来约束root_level 2返回的结果只匹配那些基于下降顺序的特定root_level 1名称的结果,我将非常感激。感谢。

1 个答案:

答案 0 :(得分:1)

您可以尝试这种方式返回与某些公司对应的所有 root-level-2 id 元素,即'Company A'

//item[root_level=2][preceding-sibling::item[root_level=1][1][name='Company A']]/id
  • //item[root_level=2]:找到所有root-level-2 <item> ...
  • [preceding-sibling::item[name][1][name='Company A']]:...拥有最近的兄弟根级别1 <name>等于"Company A"
  • /id:然后返回<id>子元素