【问题标题】:XmlWriter writing empty xmlnsXmlWriter 写入空的 xmlns
【发布时间】:2011-03-15 05:03:37
【问题描述】:

我正在使用下面的代码来初始化一个 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?

--编辑显示地标的书写方式发生了变化--
如果我将命名空间放在地标的写入中,则不会将任何元素添加到文档中。

【问题讨论】:

  • 为什么要填充 xmlns?命名空间与父节点相同。
  • @onof - 我不想要一个填充的 xmlns,我试着不开始,然后认为它更好。请参阅修改后的代码。

标签: c# .net xml xmlwriter


【解决方案1】:

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

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 文件中需要命名空间。

【讨论】:

  • 这可能是有效的,但这是不好的做法。
  • @Jason - 除非你能提供一个“好”的方法来做到这一点,否则这不是“坏”的做法;这是实现这一目标的唯一方法!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这就是我最初获得代码的方式,它给出了空的 xmlns。我已经更改了我的代码以反映这一点,将命名空间放在地标的写入中实际上不允许写入元素。
    【解决方案4】:

    你试过了吗:

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

    【讨论】:

    • 我认为你的意思是 kml 不是 klm;根据这个假设进行编辑。这仍然不起作用。
    【解决方案5】:

    你需要

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

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

    【讨论】:

    • 你的意思是你这样做了,它仍然在 Placemark 元素上用 xmlns="" 序列化?还是别的什么?
    • 即使您这样做了,您仍然会在 Placemark 元素上获得 xmlns=""。
    【解决方案6】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多