使用XmlWriter生成带命名空间无前缀XML元素的技术疑问
初始问题
要重现SQL Server .regsrvr文件里无前缀但包含sfc命名空间声明的<definitions>元素:
- 使用三参数版
WriteStartElement()会生成带sfc前缀的元素 - 使用两参数版会生成无前缀但属于默认命名空间的元素
疑问:元素名前缀的存在与否对文件解析有影响吗?(PowerShell版本7.2.7)
更新后的疑问
SSMS生成的.regsrvr文件片段如下:
<xs:bufferSchema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <definitions xmlns:sfc="http://schemas.microsoft.com/sqlserver/sfc/serialization/2007/08"> <document> <docinfo> <aliases> <alias>/system/schema/RegisteredServers</alias> </aliases> <sfc:version DomainVersion="1" /> </docinfo> <data>
其中<definitions>仅声明了sfc前缀对应的命名空间,自身无前缀。现有两个疑问:
- 如果给
<definitions>加上sfc前缀,它的后代元素会默认归到父级的xs命名空间吗? - 当
sfc是在<definitions>下声明的命名空间时,<sfc:version>必须带sfc前缀吗?
解答
元素前缀对解析的核心影响
XML解析的核心依据是命名空间URI,前缀只是URI的别名。只要元素绑定的URI一致,不管用不用前缀、用什么前缀,解析器处理逻辑完全相同。比如用三参数生成带sfc前缀的<sfc:definitions>(绑定正确的sfc URI),和SSMS生成的无前缀<definitions>(内部声明sfc前缀),只要URI对应正确,SQL Server相关工具解析时不会有差异。但要注意:如果用两参数版把<definitions>放到默认命名空间,必须确保这个默认命名空间就是sfc的URI,否则才会导致解析异常。带前缀的
<definitions>后代命名空间归属
如果<definitions>带上sfc前缀(即自身属于sfc命名空间),它的后代元素会默认继承这个sfc命名空间,除非后代元素自己声明了其他命名空间或前缀。父级的xs命名空间不会自动传递——只有当<definitions>未指定自己的命名空间时,才会继承父级的xs命名空间。<sfc:version>的前缀必要性
在SSMS的示例里,<definitions>只是声明了sfc前缀对应的URI,但自身不属于sfc命名空间(既无前缀,也未将sfc设为默认命名空间)。这种情况下,<version>要归属sfc命名空间,必须显式添加sfc:前缀。如果把<definitions>的默认命名空间设为sfc的URI(比如xmlns="http://schemas.microsoft.com/sqlserver/sfc/serialization/2007/08"),那<version>就不需要前缀,会自动归属sfc命名空间。
内容的提问来源于stack exchange,提问作者lit

