【问题标题】:XPath: excluding elements by name (recursive)XPath:按名称排除元素(递归)
【发布时间】:2014-05-07 20:00:28
【问题描述】:

我正在尝试使用 XPath 从 XML 输入中排除一些元素。 在以下示例中,我需要排除所有“X”元素

我以为我只需要使用像 //*[not(self::X)] 这样的 XPath 查询,但这似乎不适用于所有平台。

我在这两个网站上试过:

http://chris.photobooks.com/xml/default.htm

http://www.freeformatter.com/xpath-tester.html

对于第一个,xml 输出将符合预期(X 元素在输出中未突出显示),但对于第二个,输出与输入严格相同。不幸的是,将使用此 XPath 的软件与第二个网站具有相同的行为...

其他奇怪的事情:当我尝试//*[self::X] 时,我在两个站点上都得到了所有 X 元素。

你能帮我完成这个简单的请求吗?我可能遗漏了一些明显的东西,但我对 XPath 查询很陌生!谢谢。

示例:

<ROOTNODE>
    <ITEM>12345</ITEM>
    <LEVELS COUNT="1">
        <LEVEL>
            <OFFICES COUNT="3">
                <OFFICE>
                    <CODEOFF>21</CODEOFF>
                    <LIB>GALLEY AVANT</LIB>
                    <NIV>1</NIV>
                    <X>6</X>
                    <Y>78</Y>
                    <L>127</L>
                    <H>196</H>
                    <OBJECTS COUNT="7">
                        <OBJECT>
                            <CODEOBJ>G1C</CODEOBJ>
                            <LIB>GALLEY 1C</LIB>
                            <NIV>1</NIV>
                            <X>12</X>
                            <Y>143</Y>
                            <L>32</L>
                            <H>49</H>
                        </OBJECT>
                        <OBJECT>
                            <CODEOBJ>G1L</CODEOBJ>
                            <LIB>GALLEY 1L</LIB>
                            <NIV>1</NIV>
                            <X>32</X>
                            <Y>205</Y>
                            <L>34</L>
                            <H>29</H>
                        </OBJECT>
                    </OBJECTS>
                </OFFICE>
            </OFFICES>
        </LEVEL>
    </LEVELS>
</ROOTNODE>

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    XPath 从输入文档的树表示中选择节点。如果您愿意,可以考虑将指针返回到树数据结构中。

    无论您使用什么软件来显示 XPath 结果,都必须决定如何显示这些“指针”。最常用的约定是显示以您选择的节点为根的整个 XML 树。这不是唯一的方法。一些工具更喜欢显示从根到所选节点的路径。但重要的是要区分 XPath 选择的是什么(一个节点),以及它的显示方式(显示整个子树,或从根开始的路径)。

    如果您希望您的输出包含与输入不同的 XML,那么您对 ​​XPath 不走运。为此,您需要 XSLT 或 XQuery。 XPath 从输入树中严格选择节点。

    【讨论】:

    • 感谢迈克尔的解释
    【解决方案2】:

    XPath 无法做到这一点。

    XPath 只能选择整个子树,不能修改它们/构造新结果。您需要使用 XQuery 或使用一些 DOM 接口来选择和删除 &lt;X/&gt; 元素(您可以使用 XPath 查询 //X 找到)。

    【讨论】:

    • 感谢 Jens,我希望我能以这种方式使用它。我将不得不调查我使用的软件是否可以处理 XQuery
    • 你用的是哪一种?
    • 这是一个名为 Convertigo 的移动企业应用平台
    • 嗯不知道。但是可以通过运行&lt;foo/&gt; 作为查询轻松尝试。如果它返回元素,则可能是 XQuery,因为 XPath 无法构造新的 XML 元素。
    • 看来我只能提供一个XPath。感谢您的帮助
    猜你喜欢
    • 2014-08-17
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多