使用FOR XML PATH将带冒号的属性添加到xml节点

时间:2016-01-26 04:36:11

标签: sql sql-server xml tsql

我正在尝试修改存储过程以包含以下内容:

SET @XML = (    
    SELECT Category.Title,
        (       
            SELECT 'true' AS [@json:Array], Book.Name, Book.Value
            FROM @Book Book
            WHERE Category.CategoryID = Book.CategoryID
            FOR XML PATH('Values'), ROOT('Book'), TYPE
        ) 
    FROM @Category Category
    FOR XML PATH('Category'), ROOT('Response')
) 

" SELECT' true' AS [@json:Array]"是强迫xml添加" json:Array =' true'到values节点,这样即使只有一个子元素,它也将包含在一个数组中。但是,@ json:Array会抛出一个错误:" XML名称空间前缀' json' FOR XML列名称缺少声明' @json:Array'。"

我查看了this之类的链接,但它们似乎都在处理添加不包含冒号的属性。我还尝试添加" WITH NAMESPACES ..."但无法正确使用语法。

有人可以告诉我如何修改SQL以使其工作吗?

1 个答案:

答案 0 :(得分:1)

如果你这样做:

DECLARE @XML XML;
WITH XMLNAMESPACES('xmlns:json' AS json)
SELECT @XML=
(
    SELECT 'YourTitle',
        (       
            SELECT 'true' AS [@json:Array], 'BookName', 'BookValue'
            FOR XML PATH('Values'), ROOT('Book'), TYPE
        ) 
    FOR XML PATH('Category'), ROOT('Response')
) 
SELECT @xml

...你将得到attribut。但价格是所有根节点中的重复命名空间(也是嵌套的)。

这可能是一个技巧,但您必须在顶部元素中声明您的命名空间:

DECLARE @XML XML;
SELECT @XML=
(
    REPLACE(REPLACE(
    (
    SELECT 'YourTitle',
        (       
            SELECT 'true' AS [@jsonArray], 'BookName', 'BookValue'
            FOR XML PATH('Values'), ROOT('Book'), TYPE
        ) 
    FOR XML PATH('Category'), ROOT('Response')
    ),'jsonArray','json:Array'),'<Response','<Response xmlns:json="urnJson"')
); 

SELECT @xml