C# XmlWriter写入空xmlns

C# XmlWriter写入空xmlns,c#,.net,xml,xmlwriter,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")); 在后面的过程中,我使用以下

我使用以下代码初始化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元素上的空xmln

--编辑以显示对PLACEMARK编写方式的更改--

如果我将名称空间放在placemark的write中,那么将不包含任何元素添加到文档中。

oWriter.writeStarElement(“placemark”)应该可以工作,因为父节点已经有了正确的命名空间。

您尝试过:

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

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

并使用以下代码保存它,以在保存之前设置名称空间

moDocument.DocumentElement.SetAttribute("xmlns", msNamespace);
moDocument.Save(msFilePath);
这是有效的,因为名称PCE仅在保存的xml文件中是必需的。

您需要它

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

否则,Placemark元素会被放入空名称空间,这就是为什么在序列化XML时会添加
xmlns=”“
属性的原因。

这是一篇老文章,但只是为了防止将来的不良做法;您永远不应该在XML文档中声明xmlns名称空间,因此这可能是由于您正在执行XmlDocument不应该执行的操作而得到空节点的原因

前缀xmlns仅用于声明命名空间绑定,由 绑定到命名空间名称的定义。 不能申报。其他前缀不能绑定到此 命名空间名称,并且不能将其声明为默认命名空间。 元素名称不能有前缀xmlns


来源:

以下代码适用于我():


为什么您想要一个填充的xmlns?名称空间与父节点相同。@onof-我不想要填充的xmlns,我一开始没有尝试过,后来认为它更好。请参阅修订后的代码。这就是我最初编写代码的方式,它给出了空的xmlns。为了反映这一点,我修改了代码,将名称空间放在placemark的write中实际上不允许写入元素;根据这一假设编辑。这仍然不起作用。它可能是有效的,但这是一种不好的做法。@Jason-除非你能提供一种“好”的方法来做到这一点,否则这不是一种“坏”的做法;这是实现这一目标的唯一途径!您的意思是这样做,但它仍然在Placemark元素上使用xmlns=”“进行序列化?或者其他什么?即使这样做,Placemark元素上仍然会出现xmlns=“”。
oWriter.WriteStartElement("Placemark", "http://www.opengis.net/kml/2.2");
XmlSerializer s = new XmlSerializer(objectToSerialize.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
s.Serialize(xmlWriter, objectToSerialize, ns);