Oracle XMLTABLE 命名空间问题

标签 oracle plsql namespaces xmltype xmltable

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

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>

最佳答案

您可以使用默认命名空间。只需说“默认”:)。并看起来与您的 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 (搜索默认命名空间)

When a default namespace declaration is used on an element, all unqualified element names within its scope are automatically associated with the specified namespace identifier.



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

关于Oracle XMLTABLE 命名空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38268596/

相关文章:

javascript - javascript函数的设置状态不保存

c# - 在 C# 上表示通配符

sql - oracle数据库查询: primary key references t_name(col_name)?是什么意思

sql - 如何将逗号分隔的字符串转换为逗号分隔的整数并将其作为 Oracle 中的参数传递?

oracle - 如何获取Oracle中特定记录的计数?

xml - 我可以忽略来自@XmlRootElement 的 child 的命名空间吗

c# - 我可以命名以数字开头的 C# namespace 吗?

sql - 如何在不使用子查询的情况下仅选择具有最大序列的行?

Oracle:如何计算空行和非空行

oracle - PL/SQL 上下文如何工作?