【问题标题】:Oracle XMLTABLE namespace issueOracle XMLTABLE 命名空间问题
【发布时间】:2016-07-08 14:01:22
【问题描述】:

我试图通过这个脚本从下面的 XML 中获取信封 ID 为 80621b17-97a8-926d945b602a,但没有任何结果。任何人都可以有任何想法吗?

SELECT b.EnvelopeID
FROM   sample_xml a,
       XMLTABLE(xmlnamespaces('http://www.w3.org/2001/XMLSchema' as "xsd_k",
                              'http://www.w3.org/2001/XMLSchema-instance' AS "xsi",
                              'http://www.docusign.net/API/3.0' AS "k"),
       '/xsd_k:DocuSignEnvelopeInformation/xsd_k:EnvelopeStatus' PASSING a.xml
                       COLUMNS EnvelopeID        VARCHAR2(200)   PATH 'EnvelopeID')b;

我的示例 xml 是:

<DocuSignEnvelopeInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.docgign.net/API/3.0">
  <EnvelopeStatus>
    <EnvelopeID>80621b17-97a8-926d945b602a</EnvelopeID>
   </EnvelopeStatus>
</DocuSignEnvelopeInformation>

【问题讨论】:

  • 你有什么错误吗?
  • 谢谢安德烈!我没有收到任何错误,只是没有显示任何内容。但是下面莫托特的答案很好用。谢谢

标签: oracle plsql namespaces xmltype xmltable


【解决方案1】:

您可以使用默认命名空间。只需说“默认”:)。并且看起来与您的 XML 文档中的相同:

SELECT b.EnvelopeID
FROM   (SELECT xmltype ('
<DocuSignEnvelopeInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.docgign.net/API/3.0">
  <EnvelopeStatus>
    <EnvelopeID>80621b17-97a8-926d945b602a</EnvelopeID>
   </EnvelopeStatus>
</DocuSignEnvelopeInformation>') AS xml FROM DUAL) a,
       XMLTABLE(xmlnamespaces(default 'http://www.docgign.net/API/3.0'),
       '/DocuSignEnvelopeInformation/EnvelopeStatus' PASSING a.xml
                       COLUMNS EnvelopeID        VARCHAR2(200)   PATH 'EnvelopeID')b;

我们还可以修复您的变体。首先,您在 xml 文档中有“docgign”而不是“docusign”。修复两者之一。将 '/xsd_k:DocuSignEnvelopeInformation/xsd_k:EnvelopeStatus' 更改为 '/k:DocuSignEnvelopeInformation/k:EnvelopeStatus',因为这是默认命名空间,最后将 'EnvelopeID' 更改为 'k:EnvelopeID' :

SELECT EnvelopeID
FROM   (SELECT xmltype ('
<DocuSignEnvelopeInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.docusign.net/API/3.0">
  <EnvelopeStatus>
    <EnvelopeID>80621b17-97a8-926d945b602a</EnvelopeID>
   </EnvelopeStatus>
</DocuSignEnvelopeInformation>') AS xml FROM DUAL) a,
       XMLTABLE(xmlnamespaces('http://www.w3.org/2001/XMLSchema' as "xsd_k",
                              'http://www.w3.org/2001/XMLSchema-instance' AS "xsi",
                              'http://www.docusign.net/API/3.0' AS "k"),
       '/k:DocuSignEnvelopeInformation/k:EnvelopeStatus' PASSING a.xml
                       COLUMNS EnvelopeID        VARCHAR2(200)   PATH 'k:EnvelopeID')b;

HERE(搜索默认命名空间)

当在元素上使用默认命名空间声明时,所有 其范围内的非限定元素名称自动 与指定的命名空间标识符相关联。

这是因为 DocuSignEnvelopeInformation 和它下的所有其他节点都有命名空间 xmlns="http://www.docusign.net/API/3.0"。如果未定义此命名空间,则节点将没有命名空间,您不需要在 xmltable 中使用命名空间。

【讨论】:

  • 非常感谢马达!它现在起作用了。除了这里的拼写错误('docgign' 而不是 'docusign'),我想知道我不知道为什么我不应该使用 xsd_k。什么时候应该使用默认的,什么时候应该使用其他的?提前致谢
  • @xml_programmer 所有节点下的默认命名空间(因为它们不使用命名空间名称,根节点上有命名空间)是没有名称的命名空间 xmlns="docusign.net/API/3.0"。所有其他的名称为“xsi”、“xsd”。并且当节点应该在具有名称的命名空间下时,名称应该像 一样使用。我写的马卡龙是什么? :)
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 2014-04-08
  • 2013-03-26
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多