2010-07-13 2 views
4

Я использую следующий код для определения свойств XMLDOCUMENTXmlWriter писать пустой XMLNS

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?

--EDITED ПРОЯВИТЬ изменить отношение к Placemark в настоящее время WRITTEN--
Если я поставить пространство имен в записи о метках, то без элементов добавляются к документу.

+0

Почему вы хотите закрашенный Xmlns? пространство имен одинаково для родительского узла. – onof

+0

@onof - Я не хочу заполненных xmlns, я пробовал, не для начала, а затем подумал, что это лучше. См. Пересмотренный код. – stevehipwell

ответ

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.

+0

Это может быть действительно, но это плохая практика. – Jason

+2

@ Джейсон - Если вы не можете предложить «хороший» способ сделать это, то это не «плохая» практика; это единственный способ добиться этого! – stevehipwell

0

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

+0

Вот как я сначала получил код, и он дал пустой xmlns. Я изменил свой код, чтобы отразить это, помещая пространство имен в запись метки, на самом деле не позволит писать элементы. – stevehipwell

0

Пробовали ли вы:

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

Я понимаю, что это означало kml not klm; отредактированный на этом предположении. Это все еще не работает. – stevehipwell

0

Вы нужны

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

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

+0

Это не работает, как я уже говорил. – stevehipwell

+0

Вы имеете в виду, что вы это делаете, и он все еще сериализуется с помощью xmlns = "" на элементе Placemark? Или что-то другое? – Alohci

+0

Даже если вы это сделаете, вы все равно получите xmlns = "" в элементе Placemark. – stevehipwell

1

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

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

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

Смежные вопросы