【问题标题】:how to prepend xml namespace in element during query?如何在查询期间在元素中添加 xml 命名空间?
【发布时间】:2012-09-14 01:20:07
【问题描述】:

如下

DECLARE @t TABLE (Test nvarchar(50), Location_ID uniqueidentifier);
INSERT INTO @t (Test,Location_ID ) 
SELECT Test,Location_ID 
from
dbo.TEST;
DECLARE @xml XML
;WITH XMLNAMESPACES (
'typens:GPCodedValueDomain2' as type,
'http://www.esri.com/schemas/ArcGIS/10.0' as typens, 
'http://www.w3.org/TR/html4/' AS xs, 
'http://www.w3.org/2001/XMLSchema-instance' AS xsi )
SELECT @xml = 
    (
    SELECT 
    'typens:CodedValue' AS "@xsi:type", 
    TEST AS "Name", Location_ID  AS "Code"
    FROM @t 
    order by Location_ID
    FOR XML PATH
    ('CodedValue'), ROOT
    ('GPCodedValueDomain2'),TYPE
    )
SELECT @xml

输出

<GPCodedValueDomain2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/TR/html4/" xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.0" xmlns:type="typens:GPCodedValueDomain2">
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code>B59D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code>B69D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code>B79D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
</GPCodedValueDomain2>

几个小时以来,我一直在尝试不同的命名空间定义迭代,但都失败了。我正在寻找的输出是:

<GPCodedValueDomain2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/TR/html4/" xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.0" xmlns:type="typens:GPCodedValueDomain2">
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code xsi:type="xs:string">B59D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code xsi:type="xs:string">B69D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code xsi:type="xs:string">B79D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
</GPCodedValueDomain2>

对如何实现这一点有任何想法吗?谢谢

【问题讨论】:

    标签: sql xml sql-server-2008 tsql


    【解决方案1】:

    我不是 SQL Server 用户,但我想知道您是否真的提供了一个架构文档,该文档在命名空间 http://www.w3.org/TR/html4/ 中定义了一个名为 string 的类型。

    将前缀 xs 绑定到名称为 HTML 4 规范的 URI 的命名空间绝对没有错。但是有几件事让我怀疑你是否已经足够清楚地定义了你的问题。

    • HTML 4 规范没有定义名为string 的数据类型;除非您在此处未显示的模式文档中做一些非常不寻常的事情,否则xs:string 不会表示已知类型。
    • 您似乎将命名空间前缀 type 绑定到命名空间 URI typens:GPCodedValueDomain2。该名称空间前缀似乎没有在其他任何地方使用,因此尚不清楚它的用途是什么。在该名称空间名称中使用的 URI 方案 typens 也是在查询中其他地方定义的名称空间前缀这一事实表明,您要么对名称空间和名称空间前缀感到困惑,要么您正在做一些极其微妙和狡猾的事情。在后一种情况下,您肯定不需要 Stack Overflow 的帮助。
    • 您希望输出中的CodedValueCode 元素具有xsi:type 属性。通过为其指定SELECT 'typens:CodedValue' AS "@xsi:type", ...,您的查询成功地将属性放在第一位。但是Code 元素没有类似的构造。为什么不呢?

    【讨论】:

    • xml 来自最初由应用程序填充的列,该应用程序通过 xml 执行大部分应用程序配置,其中发布的 xml 就是一个示例。我很欣赏你的 cmets,但我没有做任何“狡猾”的事情,也没有发明自己的命名空间。我只是在处理应用程序输出的内容,以及读取 xml 并将元素/节点呈现给应用程序所需的内容。
    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2010-09-13
    • 1970-01-01
    • 2016-11-21
    • 2023-03-22
    相关资源
    最近更新 更多