使用 SQL 插入 XML 元素
Posted
技术标签:
【中文标题】使用 SQL 插入 XML 元素【英文标题】:Insert XML element with SQL 【发布时间】:2020-09-30 21:27:43 【问题描述】:我有一个 ASP.NET Core 应用程序。我有一个这样的 XML 文件:
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>
但是我想以编程方式向该文件添加另一个 XML 字段:
<awardedVPoints></awardedVPoints>
所以我这样尝试:
;WITH XMLNAMESPACES('http://vital.nl/qrcodeSchema.xsd' AS ns)
UPDATE[dbo].[QRCodeDefinitions]
SET[QRCodeXml].modify('insert <ns:awardedVPoints/> as first into (/ns:qrcode)[0]')
where [QRCodeXml].value('count(/ns:qrcode)', 'int') > 0
但是当我执行此操作时,我看到了一个积极的消息:
(102 rows affected)
Completion time: 2020-06-11T11:03:16.5813475+02:00
但如果我查看文件,我看不到 awardedVPoints
xmlElement。
我仍然看到这个:
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>
那么我要改变什么?
我也尝试使用这样的旧替换:
UPDATE[dbo].[QRCodeDefinitions]
SET[QRCodeXml] = CAST(REPLACE(CAST([QRCodeXml] as nvarchar(max)), '<awardedVPoints/>', ' <awardedVPoints>') as xml) from [dbo].[QRCodeDefinitions]
所以我看到了成功。但是如果我查看 xml 文件,我看不到任何更改
我是这样尝试的:
;WITH XMLNAMESPACES('http://vital.nl/qrcodeSchema.xsd' AS ns)
UPDATE[dbo].[QRCodeDefinitions]
SET[QRCodeXml].modify('insert <ns:awardedVPoints>0</ns:awardedVPoints> as first into (/ns:qrcode)[0]')
where [QRCodeXml].value('count(/ns:qrcode)', 'int') > 0 and qrcode = 'newvcheq'
(受影响的 1 行)
但如果我查看 xml,则没有任何变化。
所以这必须是期望的结果:
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<awardedVPoints>0</awardedVPoints>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>
谢谢
这就是 xsd:
<xs:complexType name="echeqType">
<xs:annotation>
<xs:documentation>Echeq action.</xs:documentation>
</xs:annotation>
<xs:complexContent>
<xs:extension base="actionVpointsBaseType">
<xs:sequence>
<xs:element name="echeqFamilyId" type="xs:string" minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
所以这必须是:
<qrcode xmlns="http://vital.nl/qrcodeSchema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Echeq>
<awardedVPoints>0</awardedVPoints>
<echeqFamilyId>67c8590e-66fe-43e1-9124-a2163a6365df</echeqFamilyId>
</Echeq>
</qrcode>
【问题讨论】:
尝试使用 SQL Server Management Studio 进行查询,看看是否有效。 SSMS 中的错误消息要好得多 但我没有看到任何错误。但是我用的是sequel server management studio V18.5 当发生更新并且没有插入任何内容时,c# 中没有错误。使用 SSMS 将报告语法问题,例如类型是否错误。您没有在查询中使用任何可能是问题的参数。 SSMS 将进行类型检查。 @NiceTobeBottleInfinity,请编辑您的原始帖子并在其中添加您想要的 XML 输出。 我编辑帖子 【参考方案1】:尝试使用 1 的索引:
;WITH XMLNAMESPACES('http://vital.nl/qrcodeSchema.xsd' AS ns)
UPDATE[dbo].[QRCodeDefinitions]
SET [QRCodeXml].modify('insert <ns:awardedVPoints/> as first into (/ns:qrcode)[1]')
where [QRCodeXml].value('count(/ns:qrcode)', 'int') > 0;
【讨论】:
以及如何获取它的默认值,例如 1 XML 验证:内容无效。预期元素: 如果您的意思是默认授予的 VPoints,我不是 XML 专家,但我认为类似“插入 1 作为第一个...”以上是关于使用 SQL 插入 XML 元素的主要内容,如果未能解决你的问题,请参考以下文章
在Python中使用ElementTree API插入xml元素作为嵌套元素。
将节点插入另一个 XML,创建新元素(或更新现有元素)并重新排序结果文档