【问题标题】:XPath and XMLs with namespaces带有命名空间的 XPath 和 XML
【发布时间】:2011-02-11 20:11:18
【问题描述】:

我有以下 XML:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfAgence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns="http://www.artos.co.il/">
  <Agence>
    <CodeAval>20008</CodeAval>
    <CodeSource>ArtPO</CodeSource>
    <LogicielSource>NTLIS</LogicielSource>
</Agence>
</ArrayOfAgence>

我想获取 CodeAval 值,所以我尝试了:

ArrayOfAgence/Agence/CodeAval

这显然是行不通的,因为这个 XML 有一个命名空间,那么,我需要如何处理呢?

谢谢,

【问题讨论】:

标签: xml xpath xml-namespaces


【解决方案1】:

您在评论中提到您在 XSLT 中使用此 XPath。在这种情况下,您需要为输入文档的默认命名空间 http://www.artos.co.il/ 添加带有前缀的命名空间定义,然后在 XPath 表达式中使用此前缀。

命名空间定义示例(不需要在stylesheet元素中)

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:artos="http://www.artos.co.il/">

XPath 表达式中的前缀用法示例

<xsl:value-of select="artos:ArrayOfAgence/artos:Agence/artos:CodeAval"/>

注意每个元素名称前面添加的前缀。

【讨论】:

    【解决方案2】:

    如果您的 XPath 库支持命名空间(您的似乎是),那么它应该为您提供命名空间别名的方法。

    例如,如果您使用 Java,则 javax.xml.xpath.XPath 对象有一个 setNamespaceContext(NamespaceContext context) 方法,可让您提供命名空间解析器。

    因此,您可能会告诉它a 是命名空间http://www.artos.co.il/ 的别名,然后您的查询将变为a:ArrayOfAgence/a:Agence/a:CodeAval

    【讨论】:

    • 我只是想创建一个 XSL,而不是使用 lib
    • 在这种情况下,您只需将命名空间添加到您的 xsl:stylesheet 元素。
    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多