XmlWriter编写空xmlns

时间:2010-07-13 08:45:00

标签: c# .net xml xmlwriter

我正在使用以下代码初始化XmlDocument

XmlDocument moDocument = new XmlDocument();
moDocument.AppendChild(moDocument.CreateXmlDeclaration("1.0", "UTF-8", null));
moDocument.AppendChild(moDocument.CreateElement("kml", "http://www.opengis.net/kml/2.2"));

稍后在此过程中,我使用以下代码

为其写入一些值
using (XmlWriter oWriter = oDocument.DocumentElement.CreateNavigator().AppendChild())
{
  oWriter.WriteStartElement("Placemark");
  //....
  oWriter.WriteEndElement();
  oWriter.Flush();
}

当我保存文档时,这最终会给我以下xml

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Placemark xmlns="">
    <!-- -->   
  </Placemark>
</kml>

如何摆脱Placemark元素上的空xmlns?

- 编辑改变以显示PLACEMARK如何写作 -
如果我将命名空间放在地标的写入中,那么非元素将被添加到文档中。

7 个答案:

答案 0 :(得分:2)

我通过使用以下代码创建文档来解决了这个问题(文档元素中没有命名空间)

XmlDocument moDocument = new XmlDocument(); 
moDocument.AppendChild(moDocument.CreateXmlDeclaration("1.0", "UTF-8", null)); 
moDocument.AppendChild(moDocument.CreateElement("kml"));

并使用以下代码保存它以在保存

之前设置命名空间
moDocument.DocumentElement.SetAttribute("xmlns", msNamespace);
moDocument.Save(msFilePath);

这是有效的,因为只在保存的xml文件中需要namespce。

答案 1 :(得分:1)

这是一个老帖子,但只是为了防止未来的不良做法;您应该从不在XML文档中声明 xmlns 命名空间,因此这可能是您获取空节点的原因,因为您正在执行XmlDocument不应该执行的操作。

  

前缀xmlns仅用于声明命名空间绑定,并且是   绑定到命名空间名称http://www.w3.org/2000/xmlns/的定义。   它不能被宣布。其他前缀不得与此绑定   名称空间名称,并且不能将其声明为默认名称空间。   元素名称不能有前缀xmlns。

来源:http://www.w3.org/TR/REC-xml-names/#ns-decl

答案 2 :(得分:0)

oWriter.WriteStartElement("Placemark");应该可以工作,因为父节点已经有了正确的命名空间。

答案 3 :(得分:0)

你有没有尝试过:

oWriter.WriteStartElement("kml", "Placemark", "kml");

答案 4 :(得分:0)

你需要

oWriter.WriteStartElement("Placemark", "http://www.opengis.net/kml/2.2");

否则Placemark元素将被置于null命名空间中,这就是为什么在序列化XML时添加xmlns=""属性的原因。

答案 5 :(得分:0)

发现这个: How to prevent blank xmlns attributes in output from .NET's XmlDocument?

基本上,将相同的命名空间放在父节点上,它将从子节点中省略它。

答案 6 :(得分:0)

以下代码对我有用(source):

XmlSerializer s = new XmlSerializer(objectToSerialize.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
s.Serialize(xmlWriter, objectToSerialize, ns);