将 XML 属性转换为 json
Posted
技术标签:
【中文标题】将 XML 属性转换为 json【英文标题】:convert XML attribute to json 【发布时间】:2021-10-26 12:50:30 【问题描述】:作为一个简化示例,请考虑这个包含两个字段的表。一个是字符串,另一个是 XML。
SELECT TOP (1) [Source]
, OrderParameter
FROM [Rops].[dbo].[PreOrder]
Source="MediaConversions"
OrderParameter=""
现在我想查询表并将结果作为json,但也将XML一次性转换为json。
SELECT TOP (1) [Source]
, OrderParameter
FROM [Rops].[dbo].[PreOrder]
for json path;
结果
["Source":"MediaConversions","OrderParameter":"
"]
但我希望将其转换为:
["Source":"MediaConversions","OrderParameter": "ParameterList":[ “x”:1,“y”:10] ]
如何添加“for json”来转换xml?
SELECT TOP (1) [Source]
, select OrderParameter for json path????
FROM [Rops].[dbo].[PreOrder]
for json path;
【问题讨论】:
当OrderParameter
的输入数据是<?xml version="1.0" encoding="utf-16"?>
时,我不明白为什么您的“结果”可以包含<ParameterList ...
等。我在 MS SQL Server 中创建了一个临时表并运行了您的第二个查询(以for json path
结尾的那个),它给了我["Source":"MediaConversions","OrderParameter":"<?xml version=\"1.0\" encoding=\"utf-16\"?>"]
。我不确定我是否看到了问题。
【参考方案1】:
您似乎想要提取 XML 中 ParameterList
节点的内部文本。为此,您可以使用 .value
和 XQuery:
SELECT TOP (1) [Source]
, OrderParameter = (
SELECT
x = x.PL.value('(x/text())[1]','int'),
y = x.PL.value('(y/text())[1]','int')
FROM (VALUES( CAST(OrderParameter AS xml) )) v(OrderParameter)
CROSS APPLY v.OrderParameter.nodes('ParameterList') x(PL)
FOR JSON PATH, ROOT('ParameterList')
)
FROM [Rops].[dbo].[PreOrder]
FOR JSON PATH;
【讨论】:
看起来不错,但是 orderparameter 是 ntext 类型并且做一个 cast(orderparam as xml).nodes 无效 好的,你可以把它放在CROSS APPLY (VALUES
中。请注意,ntext
已弃用,无论如何您都应该将 XML 存储在 xml
列中
这是一个 15 年历史的表,我试图通过将其放入 mongodb 来删除它,而不是更改架构。但是谢谢!学到了很多以上是关于将 XML 属性转换为 json的主要内容,如果未能解决你的问题,请参考以下文章
将 XML 转换为 JSON 到 XML 时保留 json:Array 属性