XmlWriter пишет пустые xmlns - PullRequest
5 голосов
/ 13 июля 2010

Я использую следующий код для инициализации 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>

Как мне избавиться от пустых xmlns в элементе Placemark?

- ИЗМЕНЕНО, ЧТОБЫ ПОКАЗАТЬ ИЗМЕНЕНИЕ КАК PLACEMARKБЫЛО НАПИСАНО - Если я помещу пространство имен в запись метки, то ни один из элементов не будет добавлен в документ.

Ответы [ 6 ]

2 голосов
/ 13 июля 2010

Я исправил проблему, создав документ со следующим кодом (без пространства имен в элементе документа)

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);

Это действительно, так как namespce требуется только в сохраненном XML-файле.

1 голос
/ 25 апреля 2012

Это старый пост, но только для предотвращения плохой практики в будущем; никогда не нужно объявлять пространство имен xmlns в документе XML, поэтому это может быть причиной того, что вы получаете пустые узлы, поскольку вы делаете то, что XmlDocument не должен делать.

Префикс xmlns используется только для объявления привязок пространства имен и по определению связан с именем пространства имен http://www.w3.org/2000/xmlns/. НЕ ДОЛЖЕН быть объявлен.Другие префиксы НЕ ДОЛЖНЫ быть связаны с этим именем пространства имен и НЕ ДОЛЖНЫ быть объявлены как пространство имен по умолчанию.Имена элементов НЕ ДОЛЖНЫ иметь префикс xmlns.

Источник: http://www.w3.org/TR/REC-xml-names/#ns-decl

0 голосов
/ 29 марта 2011

Нашел это: Как предотвратить пустые атрибуты xmlns в выходных данных из XmlDocument .NET?

По сути, поместите то же пространство имен, что и родительский, и он пропустит его в дочернем узле.

0 голосов
/ 13 июля 2010

Вам нужно

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

в противном случае элемент Placemark помещается в нулевое пространство имен, поэтому атрибут xmlns="" добавляется при сериализации XML.

0 голосов
/ 13 июля 2010

Вы пробовали:

oWriter.WriteStartElement("kml", "Placemark", "kml");
0 голосов
/ 13 июля 2010

oWriter.WriteStartElement("Placemark"); должно работать, потому что родительский узел уже имеет правильное пространство имен.

...