.NET XmlDocument生成XML时xsi:type前缀缺失原因咨询
问题原因及解决方案
原因分析
直接调用SetAttribute("xsi:type", "ns17:anObject")会丢失前缀,是因为这个重载方法仅将传入的属性名视为无命名空间的本地名称,不会解析前缀对应的命名空间关联。XmlDocument在处理时无法识别"xsi:"是合法的命名空间前缀,最终输出时会剥离前缀,只保留"type"作为属性名。
正确实现方式
要设置带命名空间前缀的属性,必须使用SetAttribute(string localName, string namespaceURI, string value)重载方法,明确指定属性对应的命名空间URI。xsi(XMLSchema Instance)是标准命名空间,其固定URI为http://www.w3.org/2001/XMLSchema-instance。
修改后的VB.NET代码如下:
' 定义xsi标准命名空间URI Dim xsiNs As String = "http://www.w3.org/2001/XMLSchema-instance" ' 创建目标元素 Dim AiD As XmlElement = myXML.CreateElement("ns8:AiD", aNamespace) AiD.InnerText = "myInnerText" ' 使用带命名空间的重载设置xsi:type属性 AiD.SetAttribute("type", xsiNs, "ns17:anObject") ' 声明ns17命名空间 AiD.SetAttribute("xmlns:ns17", "http://aLink") ' 可选:显式声明xsi命名空间(若未自动生成) AiD.SetAttribute("xmlns:xsi", xsiNs) WR.AppendChild(AiD)
补充说明
- xsi是XML标准定义的命名空间,必须使用官方指定的URI,不能自定义;
- 若未显式声明xsi命名空间,XmlDocument在输出时会自动为xsi前缀添加对应的命名空间声明,无需手动设置;
- 该逻辑适用于所有带命名空间前缀的XML属性,核心是通过命名空间URI而非前缀字符串来关联属性的命名空间。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

