【问题标题】:XPath command to get only a specific element data and not othersXPath 命令仅获取特定元素数据而不获取其他元素
【发布时间】:2021-06-21 04:09:54
【问题描述】:

假设我有一个 XML 文件 -

<Cars>
            <Year> 2021 </Year>
            <Model>
                <Name> Porsche 911 </Name>
                <Year> 2020 </Year>
            </Model>
            <Model>
                <Name> Porsche 911 </Name>
                <Year> 2019 </Year>
            </Model>
            <Model>
                <Name> Porsche Cayenne </Name>
                <Year> 2019 </Year>
            </Model>
</Cars>

现在我想提取年份 2021,它不是该特定模型的年份,而是编写此 XML 的日期(它是外部那个)

但是要做到这一点.. 由于路径上的限制没有被硬编码,我使用的是//Year//text(),但它给出的输出为[2021,2020,2019,2019]。我不希望这样,因为如果更改顺序,索引就会更改,这会产生问题。

请提供一个 XPath 命令帮助我可以排除内部 Year 标记而只使用外部标记。

【问题讨论】:

    标签: xml xpath xml-parsing xpath-2.0 domxpath


    【解决方案1】:

    试试这个只能得到外年

    //Year[not(preceding-sibling::Name)]/text()
    

    如果需要,Year 节点(节点)始终是 Cars 的直接子节点,那么

    //Cars/Year/text()
    

    应该也可以

    【讨论】:

    • 取决于Cars 如何随时间和其他事件发生变化,也许只需要/Cars/Year[1]/text() 就足够了。
    • @kjhughes 是的。我假设在提供的 XML 示例中 CarsYear 之间的空格可能意味着有更多的“临时”节点
    • @kjhughes 但是如果那一年是在最后而不是在顶部提到的。我无法对其进行硬编码
    • @Mud:在您发布的示例 XML 中,Year 多次作为Cars 的直接子代出现。您想要的特定Year 的显着不变特征是什么? (如果您打算缩进来表示子关系,那么 XML 本身就违背了这种意图。在这种情况下,请修复 XML 以反映实际的层次结构,并正确缩进。)
    • 一个 Year 是 Cars 的直接子代,而另一个 Years 是 Model 的子代。是的,对不起,我现在已经更正了表示中的错误