T-SQL:使用命名空间查询 xml

Posted

技术标签:

【中文标题】T-SQL:使用命名空间查询 xml【英文标题】:T-SQL: query xml with namespace 【发布时间】:2015-05-12 11:26:16 【问题描述】:

我之前在 T-SQL 中做过一些基本的 xml 工作,但实际上是“基本的”。

现在遇到一些更复杂的 xml,我完全不知道从哪里开始。

<?xml version="1.0" encoding="UTF-8"?>
<Calculation:scenario xmlns:Calculation="http://www.sap.com/ndb/BiModelCalculation.ecore" schemaVersion="2.3" id="ADR2" applyPrivilegeType="ANALYTIC_PRIVILEGE" checkAnalyticPrivileges="true" defaultClient="$$client$$" defaultLanguage="$$language$$" visibility="internal" calculationScenarioType="TREE_BASED" dataCategory="DIMENSION" enforceSqlExecution="false" executionSemantic="UNDEFINED" outputViewType="Projection">
<origin/>
<descriptions defaultDescription="ADR2"/>
<metadata activatedAt="2015-04-22 16:13:29.0" changedAt="2015-04-22 21:12:59.193"/>
<localVariables/>
<variableMappings/>
<dataSources>
    <DataSource id="ADR2" ....

我所有的尝试都只是带回&lt;blank&gt; 我猜问题是分号“Calculation:scenario”和“xmlns:Calculation” 从到目前为止的谷歌搜索来看,这是一个“命名空间”。

但是,在我发现的所有使用命名空间查询 xml 的示例中,源 xml 都有一个属性,例如:xmlns:ns="uri"

然后他们在查询中使用它:“;WITH XMLNAMESPACES ('uri' as ns)”

我的 xml 没有这个 ns 属性。

谁能给我任何关于从哪里开始的指示,或者一些包含我的场景的基本教程?

非常感谢

【问题讨论】:

【参考方案1】:

在命名空间中选择元素或属性的一个示例:

declare @xml XML = '<?xml version="1.0" encoding="UTF-8"?>
<Calculation:scenario xmlns:Calculation="http://www.sap.com/ndb/BiModelCalculation.ecore" schemaVersion="2.3" id="ADR2" applyPrivilegeType="ANALYTIC_PRIVILEGE" checkAnalyticPrivileges="true" defaultClient="$$client$$" defaultLanguage="$$language$$" visibility="internal" calculationScenarioType="TREE_BASED" dataCategory="DIMENSION" enforceSqlExecution="false" executionSemantic="UNDEFINED" outputViewType="Projection">
<origin/>
<descriptions defaultDescription="ADR2"/>
<metadata activatedAt="2015-04-22 16:13:29.0" changedAt="2015-04-22 21:12:59.193"/>
<localVariables/>
<variableMappings/>
</Calculation:scenario>'

select @xml.value('declare namespace calc="http://www.sap.com/ndb/BiModelCalculation.ecore";
(calc:scenario/@id)[1]', 'varchar(max)') as 'scenario_id'

输出:

基本上,您需要声明命名空间前缀 (calc) 到命名空间 URI (http://www.sap.com/ndb/BiModelCalculation.ecore) 的映射,然后在 XQuery 语句 ((calc:scenario/@id)[1]) 中正确使用声明的前缀。所有提到的步骤都在上面的示例中进行了演示。

供参考:

MSDN: XML.value()

MSDN: XML.nodes()

【讨论】:

@SimonB 不要忘记accept 答案。或者,也许您有特定的理由让问题像这样悬而未决?

以上是关于T-SQL:使用命名空间查询 xml的主要内容,如果未能解决你的问题,请参考以下文章

从 xml 中提取值,它具有命名空间并解析 xml cdata

XML查询命名空间和节点

具有动态命名空间的 Oracle 提取值

Oracle Sql 属性与命名空间

『XML』XML/XSD命名空间解析

Hadoop—如何查看HDFS默认的ns命名空间和所有命名空间列表