【问题标题】:Selecting columns as XML with namespace使用命名空间选择列作为 XML
【发布时间】:2014-06-11 09:13:21
【问题描述】:

我需要从表中选择一些列作为 XML,其中包含名称空间以及其他列。例如,我有以下表格布局:

ID  C1  X1C1  X1C2  X2C3
1   A   1     2     3

查询应该返回的是:

ID  C1  XmlData
1   A   <xmldata1>
2   A   <xmldata2>

&lt;xmldata1&gt; 的位置:

<Root xmlns:xsd="w3.org/2001/XMLSchema" xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:mst="microsoft.com/wsdl/types/">
  <Child attrib="C1">
    <ChildValue xsi:type="xsd:integer">1</ChildNode>
  </Child>
  <Child attrib="C2">
    <ChildNode xsi:type="xsd:integer">2</ChildNode>
  </Child>
</Root>

而&lt;xmldata2&gt; 将是:

<Rootxmlns:xsd="w3.org/2001/XMLSchema" xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:mst="microsoft.com/wsdl/types/">
  <Child attrib="C3">
    <ChildNode xsi:type="xsd:integer">3</ChildNode>
  </Child>
</Root>

我对如何从this SO question 构建 xml 有很好的参考,但我无法放入命名空间。如果可以的话怎么办?

编辑: 我使用以下查询试图获得所需的结果: 选择 1 ID, 'A' C1, 1 X1C1, 2 X1C2, 3 X2C3 进入#t

;with xmlnamespaces('w3.org/2001/XMLSchema' as xsd, 'w3.org/2001/XMLSchema-instance' as xsi, 'microsoft.com/wsdl/types/' as mst)
select ID, C1, (select (SELECT 'C1' "@attrib", 'xsd:integer' "ChildValue/@xsi:type",t.X1C1 as 'ChildValue' FOR XML PATH('Child'), type),(SELECT 'C2' "@name", 'xsd:integer' "ChildValue/@xsi:type", t.X1C2 as 'ChildValue' FOR XML PATH('Child'), type) FOR XML PATH('Root'), type) as property_data 
FROM #t t

drop table #t

这是其 xml 部分的输出:

<Root xmlns:mst="microsoft.com/wsdl/types/" xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema">
<Child xmlns:mst="microsoft.com/wsdl/types/" xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema" attrib="C1">
    <ChildValue xsi:type="xsd:integer">1</ChildValue>
  </Child>
  <Child xmlns:mst="microsoft.com/wsdl/types/" xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema" name="C2">
    <ChildValue xsi:type="xsd:integer">2</ChildValue>
  </Child>
</Root>

我无法摆脱 Child 节点中的命名空间。

【问题讨论】:

标签: sql xml tsql sql-server-2008-r2


【解决方案1】:

我使用了这个解决方案:TSQL for xml add schema attribute to root node

基本上,我没有将命名空间放在开头,但在生成所需的 xml 结构后,我将 xml 转换为 nvarchar(max) 并将根节点替换为所需的命名空间。

我还需要在属性中使用命名空间前缀。为此,我使用了一个伪属性名称,将其替换为适当的 xml 命名空间前缀。

这两个操作都是使用 tsql REPLACE 函数完成的。哈克但找不到其他合适的方法。

【讨论】:

    【解决方案2】:

    您需要包含 WITH xmlnamespaces ,例如:

    ;with xmlnamespaces('w3.org/2001/XMLSchema' as xsd, 'w3.org/2001/XMLSchema-instance' as xsi, 'microsoft.com/wsdl/types/' as mst)
    select ID, C1,
    (select 
    (SELECT 'C1' "@name",t.C1 as 'value'FOR XML PATH('Property'), type),
    (SELECT 'C2' "@name",t.C2 as 'value'FOR XML PATH('property'), type)
    FOR XML PATH('data'), type) as property_data 
    FROM TableName t
    

    【讨论】:

    • 我有这个查询:select ID, C1,(select (SELECT 'C1' "@name",t.C1 as 'value'FOR XML PATH('Property'), type),(SELECT 'C2' "@name",t.C2 as 'value'FOR XML PATH('property'), type)FOR XML PATH('data')) as property_data FROM TableName t 和 with 不支持那里。有其他选择吗?
    • 我使用您的示例更改了 sql。请注意,我添加了 ;with xmlnamespaces 行,并且还在外部节点中添加了“类型”。它似乎工作正常。请尝试并告诉我。
    • 通过这个查询属性节点也可以获取命名空间。我只在根节点需要命名空间。
    【解决方案3】:

    你试过吗? select XML_COL_NAME.value('(/rootNode//childNode/node())[1]', 'nvarchar(64)') from tableName

    【讨论】:

    • 我不确定是否必须使用命名空间。希望对您有所帮助。
    猜你喜欢
    • 2010-09-21
    • 2017-06-02
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多