XmlWriter写空xmlns

问题描述 投票:5回答:7

我正在使用以下代码初始化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?

-编辑显示如何更改放置标记-如果我将名称空间放在地标的写入中,则不会将任何元素添加到文档中。

c# .net xml xmlwriter
7个回答
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文件中需要名称空间。


1
投票

[这是旧帖子,但只是为了防止将来的不良做法;您应该never在XML文档中声明xmlns命名空间,所以这可能是您获得空节点的原因,因为您正在执行XmlDocument不应该做的事情。

前缀xmlns仅用于声明名称空间绑定,并且通过定义绑定到名称空间名称http://www.w3.org/2000/xmlns/。不得声明。其他前缀不得与此绑定名称空间名称,并且不得将其声明为默认名称空间。元素名称不得带有前缀xmlns。

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


0
投票

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


0
投票

您尝试过:

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

0
投票

您需要

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

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


0
投票

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

基本上,放置与父级相同的名称空间,它将在子节点中忽略它。


0
投票

以下代码为我工作(source):

XmlSerializer s = new XmlSerializer(objectToSerialize.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
s.Serialize(xmlWriter, objectToSerialize, ns);
© www.soinside.com 2019 - 2024. All rights reserved.