XmlWriter写入空的xmlns

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?

--编辑以展示对Placemark写入方式的更改--
如果我在写入Placemark时放置命名空间,则文档中不会添加任何元素。


为什么你想要一个填充的xmlns?命名空间与父节点相同。 - onof
@onof - 我不想要填充的xmlns,一开始我尝试了没有它,然后尝试加上它,以为这样更好。请参见修改后的代码。 - stevehipwell
6个回答

4

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

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
@Jason - 除非你能提供一种“好”的方法来完成这个任务,否则这并不是“糟糕”的做法;这是实现此目标的唯一方法! - stevehipwell

1

这是一篇旧文章,但为了防止未来的不良实践,您应该永远不要在XML文档中声明xmlns命名空间,因此这可能是您获得空节点的原因,因为您正在做XmlDocument不应该做的事情。

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

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


1
以下代码对我有效 (source):
XmlSerializer s = new XmlSerializer(objectToSerialize.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
s.Serialize(xmlWriter, objectToSerialize, ns);

0

你试过了吗:

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

我理解您的意思是 kml 而不是 klm;在此假设下进行了编辑。但是这仍然不起作用。 - stevehipwell

0

你需要的是:

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

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

你的意思是你这样做,Placemark元素仍然序列化为xmlns = ""吗?还是其他什么问题? - Alohci
即使您这样做,Placemark元素仍会获得xmlns =“”属性。 - stevehipwell

0

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


那是我最初的代码,它会给出空的 xmlns。我已经更改了我的代码以反映这一点,在 placemark 的写入中放置命名空间实际上不允许元素被写入。 - stevehipwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接