自闭合元素<SomeElement/> 在语义上与<SomeElement></SomeElement> 相同。您不应该为此烦恼...如果您的阅读工具(或第三方要求)需要此工具,您应该更换此工具或与您的合作伙伴讨论。
问题是:你无法控制,事情会保持原样。即使在某些情况下,您可以使用开始和结束标记存储空值,这可能会在以后的调用中隐式更改。
试试这个:
DECLARE @tbl TABLE(ID INT IDENTITY,YourXML XML);
INSERT INTO @tbl VALUES
(
(SELECT '' AS [SomeTag] FOR XML PATH('RowNode'),ROOT('RootNode'),TYPE)
)
,(
(SELECT '' AS [SomeTag] FOR XML RAW('RowNode'),ROOT('RootNode'), ELEMENTS)
)
,(
N'<RootNode>
<RowNode>
<SomeTag></SomeTag>
</RowNode>
</RootNode>'
)
,
(CAST(
N'<RootNode>
<RowNode>
<SomeTag></SomeTag>
</RowNode>
</RootNode>'AS XML)
);
DECLARE @FirstXml XML=(SELECT YourXml FROM @tbl WHERE ID=1);
INSERT INTO @tbl VALUES(@FirstXml);
INSERT INTO @tbl SELECT @FirstXml;
INSERT INTO @tbl SELECT @FirstXml.query(N'.');
SELECT * FROM @tbl
结果
ID YourXML
--FOR XML PATH created - why ever - both tags
1 <RootNode><RowNode><SomeTag></SomeTag></RowNode></RootNode>
--FOR XML AUTO and all implicit casts use self-closing tags
2 <RootNode><RowNode><SomeTag /></RowNode></RootNode>
3 <RootNode><RowNode><SomeTag /></RowNode></RootNode>
4 <RootNode><RowNode><SomeTag /></RowNode></RootNode>
--Here we insert the first node *as is*
5 <RootNode><RowNode><SomeTag></SomeTag></RowNode></RootNode>
6 <RootNode><RowNode><SomeTag></SomeTag></RowNode></RootNode>
--But `.query()` will reformat this
7 <RootNode><RowNode><SomeTag /></RowNode></RootNode>
一些背景:
XML 不存储为您看到的字符串表示形式,而是存储为层次结构表。每当您在屏幕上显示 XML 时,它的字符串表示就会从头开始重建。每次调用它时都会略有不同(例如属性的顺序、CDATA 部分、空元素)。
如果您需要,您只能在字符串级别强制执行此格式。您可能会使用某种RegEx 方法,将任何<abc/> 替换为<abc></abc>。
但又一次:你不应该考虑那个......
更新
用这个SELECT试试上面的代码:
SELECT *
,CAST(YourXML AS NVARCHAR(MAX)) AS CastedToString
FROM @tbl
结果
ID YourXML
CastedToString
--implicitly changed to self-closing tags
1 <RootNode><RowNode><SomeTag></SomeTag></RowNode></RootNode>
<RootNode><RowNode><SomeTag/></RowNode></RootNode>
--Self-closing **without a blank!!!**
2 <RootNode><RowNode><SomeTag /></RowNode></RootNode>
<RootNode><RowNode><SomeTag/></RowNode></RootNode>
您可以看到,字符串级别的比较并不是那么容易...而且很难预测...您可以使用CAST(YourXml.query(N'.') AS NVARCHAR(MAX)) 对每个 XML 执行相同的操作...