使用 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,创建新元素(或更新现有元素)并重新排序结果文档

如何在 QTreeWidget 中获取 XML 元素的 ID 并将新元素插入其中

生成XML文档时如何插入元素计数

从 SQL 选择查询创建 XML

java - 如何在java中的某个元素之后/之前将元素插入xml