2010-07-13 3 views
4

J'utilise le code suivant pour initialiser un XmlDocumentXmlWriter écrit xmlns vide

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

Plus tard dans le processus que j'écris des valeurs à l'aide du code ci-dessous

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

Cela finit par donner moi le xml suivant quand je sauvegarde le document

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

Comment puis-je me débarrasser des xmlns vides sur l'élément Placemark?

--EDITED DE MONTRER LE CHANGEMENT DE COMMENT ÊTRE WRITTEN-- Placemark A ÉTÉ
Si je mets l'espace de noms dans l'écriture de non alors placemark des éléments sont ajoutés au document.

+0

Pourquoi voulez-vous un xmlns rempli? l'espace de noms est le même que le nœud parent. – onof

+0

@onof - Je ne veux pas de xmlns remplis, j'ai essayé sans commencer et ensuite en pensant que c'était mieux. Voir le code révisé. – stevehipwell

Répondre

2

J'ai résolu le problème en créant le document avec le code suivant (pas d'espace de noms dans l'élément de document)

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

Et en enregistrant avec les éléments suivants code pour définir l'espace de nom avant la sauvegarde

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

Ceci est valide car le nom est seulement r équippé dans le fichier xml enregistré.

+0

Cela peut être valide, mais c'est une mauvaise pratique. – Jason

+2

@Jason - À moins que vous puissiez offrir une «bonne» façon de le faire, alors ce n'est pas une mauvaise pratique; c'est le seul moyen d'y parvenir! – stevehipwell

0

oWriter.WriteStartElement("Placemark"); devrait fonctionner, car le nœud parent a déjà le bon espace de noms.

+0

C'est ainsi que j'ai eu le code initialement et il donne les xmlns vides. J'ai changé mon code pour refléter cela, mettre l'espace de noms dans l'écriture du repère ne permettra pas en réalité d'écrire les éléments. – stevehipwell

0

Avez-vous essayé:

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

Je suppose que vous vouliez dire kml pas klm; édité sur cette hypothèse. Cela ne fonctionne toujours pas. – stevehipwell

0

Vous aviez besoin de

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

sinon l'élément Placemark se mettre dans l'espace null, ce qui est la raison pour laquelle l'attribut xmlns="" est ajouté lorsque vous sérialiser XML.

+0

Cela ne fonctionne pas, comme je l'ai déjà dit. – stevehipwell

+0

Vous voulez dire que vous faites cela, et il est encore sérialisé avec xmlns = "" sur l'élément Placemark? Ou autre chose? – Alohci

+0

Même si vous faites cela, vous obtenez toujours xmlns = "" sur l'élément Placemark. – stevehipwell

1

Ceci est un ancien article, mais juste pour prévenir les mauvaises pratiques futures; ne jamais déclarer l'espace de noms xmlns dans un document XML, donc cela peut être la raison pour laquelle vous obtenez des nœuds vides puisque vous faites quelque chose que le XmlDocument n'est pas censé faire.

Le préfixe xmlns est utilisé que pour déclarer les liaisons d'espace de noms et est par définition liée au nom d'espace de noms http://www.w3.org/2000/xmlns/. Il NE DOIT PAS être déclaré. Les autres préfixes NE DOIVENT PAS être liés à ce nom d'espace de noms et NE DOIVENT PAS être déclarés comme espace de noms par défaut. Les noms d'éléments NE DOIVENT PAS avoir le préfixe xmlns.

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