开发者

XmlWriter writing empty xmlns

开发者 https://www.devze.com 2023-01-06 19:04 出处:网络
I\'m using the following code to initialise an XmlDocument XmlDocument moDocument = new XmlDocument();

I'm using the following code to initialise an XmlDocument

XmlDocument moDocument = new XmlDocument();
moDocument.AppendChild(moDocument.Cr开发者_开发技巧eateXmlDeclaration("1.0", "UTF-8", null));
moDocument.AppendChild(moDocument.CreateElement("kml", "http://www.opengis.net/kml/2.2"));

Later in the process I write some values to it using the following code

using (XmlWriter oWriter = oDocument.DocumentElement.CreateNavigator().AppendChild())
{
  oWriter.WriteStartElement("Placemark");
  //....
  oWriter.WriteEndElement();
  oWriter.Flush();
}

This ends up giving me the following xml when I save the document

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

How can I get rid of the empty xmlns on the Placemark element?

--EDITED TO SHOW CHANGE TO HOW PLACEMARK WAS BEING WRITTEN--

If I put the namespace in the write of placemark then non of the elements are added to the document.


I have fixed the issue by creating the document with the following code (no namespace in the document element)

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

And by saving it with the following code to set the namespace before the save

moDocument.DocumentElement.SetAttribute("xmlns", msNamespace);
moDocument.Save(msFilePath);

This is valid as the namespce is only required in the saved xml file.


This is an old post, but just to prevent future bad practice; you should never declare the xmlns namespace in an XML document, so this may be the cause why you get empty nodes since you are doing something the XmlDocument is not supposed to do.

The prefix xmlns is used only to declare namespace bindings and is by definition bound to the namespace name http://www.w3.org/2000/xmlns/. It MUST NOT be declared . Other prefixes MUST NOT be bound to this namespace name, and it MUST NOT be declared as the default namespace. Element names MUST NOT have the prefix xmlns.

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


oWriter.WriteStartElement("Placemark"); should work, because the parent node already has the right namespace.


Did you try:

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


You needed

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

otherwise the Placemark element gets put in the null namespace, which is why the xmlns="" attribute is added when you serialize the XML.


The following code worked for me (source):

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

精彩评论

暂无评论...
验证码 换一张
取 消