使用XmlWriter生成XML时如何添加无前缀的默认命名空间
C# XmlWriter生成带默认命名空间的XML文档解决方案
错误原因
xmlns是XML预留的命名空间声明关键字,.NET的XmlWriter内置了命名空间声明的自动处理逻辑,不允许开发者手动写入xmlns开头的属性,你之前的两种写法都违背了XmlWriter的设计逻辑,因此会抛出异常。
正确解决方案
直接在调用WriteStartElement创建根元素时,通过重载方法传入默认命名空间参数即可,XmlWriter会自动生成符合要求的xmlns属性:
// 命名空间变量,和你之前的取值完全一致 string ns = "http://www.organdonation.nhs.uk/XMLschema/DCERT/ns"; using (var writer = XmlWriter.Create(fileName, settings)) { writer.WriteStartDocument(); // 关键修改:调用双参数的WriteStartElement重载,第二个参数传入命名空间 writer.WriteStartElement("GeneticsTestReport", ns); writer.WriteAttributeString("SchemaVersion", SchemaVersion); // 后续原有代码无需大范围修改,仅注意:如果子元素也属于该命名空间,写子元素时也要传入ns参数 // 示例子元素写法:writer.WriteStartElement("子节点名", ns); // 其余原有逻辑保持不变 writer.WriteEndElement(); writer.WriteEndDocument(); }
上述代码生成的XML开头完全匹配要求的格式:
<?xml version="1.0" encoding="UTF-8"?> <GeneticsTestReport SchemaVersion="1-4" xmlns="http://www.organdonation.nhs.uk/XMLschema/DCERT/ns">
注意事项
如果文档内的子节点也属于这个默认命名空间,写子节点的WriteStartElement方法必须同样传入该命名空间参数,否则XmlWriter会自动给子节点添加xmlns=""的多余声明,破坏文档结构。
内容的提问来源于stack exchange,提问作者Neil J
相关产品推荐
相关产品推荐

