当前位置: 首页 > 面试题库 >

如何使用Xpath检索XML文件中的名称空间

权浩邈
2023-03-14
问题内容

我有一个像这样开始的XML文件:

<Elements name="Entities" xmlns="XS-GenerationToolElements">

我将不得不打开许多这些文件。它们中的每一个都有不同的名称空间,但一次只能有一个名称空间(我永远不会在一个xml文件中找到两个定义的名称空间)。

使用XPath,我希望有一种自动的方法将给定的名称空间添加到名称空间管理器中。到目前为止,我只能通过解析xml文件来获取名称空间,但是我有一个XPathNavigator实例,并且它应该具有一种不错且干净的方式来获取名称空间,对吗?

  • 要么 -

鉴于我只有一个名称空间,因此以某种方式使XPath使用xml中存在的唯一名称空间,从而通过始终附加名称空间来避免使代码混乱。


问题答案:

您可以尝试几种技巧。您使用哪种信息将取决于从文档中获取准确的信息,所需的严格程度以及所使用的XPath实现的一致性。

获取与特定前缀关联的名称空间URI的一种方法是使用namespace::轴。这将为您提供一个名称空间节点,其名称是前缀,其值是名称空间URI。例如,您可以使用以下路径在document元素上获取默认名称空间URI:

/*/namespace::*[name()='']

您也许可以使用它来为XPathNavigator设置名称空间关联。但是请注意,该namespace::轴是XPath 1.0那些角的其中之一,而这些角并不总是实现的。

获取该名称空间URI的第二种方法是namespace-uri()在document元素上使用函数(您已经说过将始终在该名称空间中)。表达方式:

namespace-uri(/*)

将为您提供该名称空间。

另一种选择是忘记将前缀与该名称空间相关联,而只将路径设为无名称空间。local-name()每当需要引用其名称空间未知的元素时,都可以通过使用该函数来实现。例如:

//*[local-name() = 'Element']

如果您确实需要,可以再进一步一步,针对document元素之一测试该元素的名称空间URI:

//*[local-name() = 'Element' and namespace-uri() = namespace-uri(/*)]

考虑到名称空间对您而言毫无意义,最后一个选择是通过剥离名称空间的过滤器运行XML。这样,您完全不必担心XPath中的它们。最简单的方法是xmlns使用正则表达式删除属性,但是如果需要同时进行其他整理,则可以执行更复杂的操作。



 类似资料:
  • 问题内容: 我知道此页面中有很多此主题,但可悲的是,我仍然无法解决我的问题。 这是我的xml代码: 这是我在Java中的代码: 是的,像往常一样,我无法获得输出,因为它仅显示: 仅当我删除ns:1时,才会显示输出,xml的代码将如下所示: 问题是,我在网上发现的所有建议似乎都没有用: 例如,我已经尝试过 等2 .. 我能得到的唯一最好的输出是,它将显示: 谁能给我正确的代码给我解决我的问题? 提前

  • 问题内容: 当我的XML看起来像这样(no )时,我可以使用XPath轻松查询它 但是当看起来像这样我就不能 有任何想法吗? 问题答案: 在第二个示例XML文件中,元素绑定到名称空间。你的XPath尝试处理绑定到默认“无名称空间”名称空间的元素,因此它们不匹配。 首选方法是使用名称空间前缀注册名称空间。它使你的XPath更加易于开发,读取和维护。 但是,并不一定要注册名称空间并在XPath中使用名

  • 问题内容: 您可以帮助我调整此代码,以便它成功解析XML吗?如果删除XML名称空间,它将起作用: 问题答案: 您必须在XPath中使用前缀,例如:“ / my:foo / my:bar”您可以选择任何喜欢的前缀-它与您在XML中使用或不使用的前缀无关。文件-但您必须选择一个。这是XPath 1.0的限制。 您必须执行从“我”到“ http://foo.bar/boo ”的前缀映射(而不是“ htt

  • 使用xslt 1.0(BizTalk 2016)我正在寻找一种通用的方法来选择任何有效的xml文档的命名空间 例如,我有以下xml文档: 假设根元素的值可以是任何东西,那么选择名称空间值的xpath是什么http://www.random.com/bo/request/portfolioactivation 我原本希望“/*/@xmlns”能起作用,但事实并非如此。

  • 问题内容: 我想操作具有默认名称空间但没有前缀的xml文档。有没有办法使用没有名称空间uri的xpath,就像没有名称空间一样? 我相信,如果将documentBuilderFactory的namespaceAware属性设置为false,那应该是可能的。但就我而言,它不起作用。 我的理解是不正确的还是我在代码中做错了? 这是我的代码: 这是我的xml: 问题答案: 使用默认名称空间(无前缀)的文

  • 我试图使用名称空间从xml文件中选择一个xml节点。我已经有了一个选项,但第二个选项无法使用。 这是简化的xml(在python代码中存储为BookMetaData): 这是我到目前为止编写的python代码: 我尝试过的不起作用的东西: how-to-use-xpath-from-lxml-on-null-namessped-节点命名空间"http://www.idpf.org/2007/opf