如果我有以下一些空节点的 xml,如下所示。
<TAG ID="abc"></TAG>
当我修改/选择此 xml 时,它会返回空标签,例如
<TAG ID="abc" />
我想要关闭的空标签</TAG>
像关闭一样
我可以做到这一点...?
如果我有以下一些空节点的 xml,如下所示。
<TAG ID="abc"></TAG>
当我修改/选择此 xml 时,它会返回空标签,例如
<TAG ID="abc" />
我想要关闭的空标签</TAG>
像关闭一样
我可以做到这一点...?
请注意,SQL Server 中 XML 结果的序列化不是由 XQuery 本身决定的,而是由 XML 数据类型到字符串表示形式的转换决定的。在你的例子中
DECLARE @X XML; SET @X = '<TAG ID="abc"></TAG>'; SELECT @X;
您没有使用 XQuery,您只是在使用 XML Parser 和 XML 序列化程序。
因此,即使我们添加了 XQuery vNext 的序列化选项,它们也不会产生影响。
正如 Michael Kay 所提到的,这两个序列化之间没有区别。为什么要区分两者?如果您有一个需要区分的工具,我建议让他们更改它以使其解析器符合标准。或者,看看您是否可以在客户端找到一个 XML Parser/serializer,它为您提供有关如何序列化空内容元素的选项。
如果您需要完全的词法保真度而不是数据库中的 XML Infoset 保真度,我建议将您的 XML 存储在 varbinary(max) 中,因为这将保留您的编码和您输入的每个代码点,但代价是必须执行运行时转换为 XML 以进行任何查询处理。
最好的问候迈克尔
任何使用 XML 的应用程序都应该将 和 视为等价的,因此 XQuery 处理器假定它们是等价的,并且没有正当理由让用户更喜欢一种形式而不是另一种形式。(类似地,例如,它们不允许您要求属性使用单引号而不是双引号,或者在“=”符号周围添加空格。)
在许多 XQuery 3.0 处理器(BaseX、Saxon 等)中,“html”可以指定为序列化选项,它将以预期的方式输出空元素:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method "html";
<TAG ID="abc"></TAG>
但是,我不知道 SQL Server 何时/是否支持 XQuery 3.0,或者它是否提供了另一种更改序列化默认值的方法。