Création d’éléments XML sans déclaration d’espace de noms

Je tente d’append un nouvel élément “PropertyGroup” au fichier XML suivant

  {00AA7ECA-95A0-0000-0000-AD4D2E056BFE} Library Properties testnS testname 4B84E5C0-EC2B-4C0C-8B8E-3FAEB09F74C6   

Le code que j’utilise est le suivant (notez qu’une autre logique a été supprimée):

  XmlTextReader reader = new XmlTextReader(filename); XmlDocument doc = new XmlDocument(); doc.Load(reader); reader.Close(); XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); ns.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/2003"); XmlElement root = doc.DocumentElement; XmlNode refNode = root.SelectSingleNode("x:Project", ns); root.SelectSingleNode("Project", ns); XmlElement newElement = doc.CreateElement("PropertyGroup", "http://schemas.microsoft.com/developer/msbuild/2003"); newElement.InnerXml = "test"; root.InsertAfter(newElement, refNode); doc.Save(filename); 

Cela génère le nouvel élément suivant dans le document XML:

  test  

Comment puis-je me débarrasser de la déclaration d’espace de noms sur l’élément?

Vous devez spécifier l’espace de nom XML pour tous les éléments que vous ajoutez au DOM:

 XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); ns.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/2003"); XmlElement root = doc.DocumentElement; XmlNode refNode = root.SelectSingleNode("x:Project", ns); XmlElement newElement = doc.CreateElement( "PropertyGroup", "http://schemas.microsoft.com/developer/msbuild/2003"); var value = newElement.AppendChild(doc.CreateElement( "value", "http://schemas.microsoft.com/developer/msbuild/2003")); value.AppendChild(doc.CreateTextNode("test")); root.InsertAfter(newElement, refNode); 

Si vous ne le faites pour aucun élément (ou si vous utilisez InnerXml cette manière), cet élément obtiendra l’espace de nom vide redouté.

La raison en est que vous avez défini l’espace de noms par défaut du document comme ” http://schemas.microsoft.com/developer/msbuild/2003 ” en définissant la définition de l’espace de noms sur le nœud racine:

 xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 

Vous devez ensuite append au document un élément qui ne se trouve pas dans un espace de noms (l’espace de noms ‘null’). Cela doit être qualifié avec

 xmlns="" 

sinon, cela signifierait que le nouvel élément se trouvait dans l’espace de noms Microsoft mentionné précédemment – ce qui n’est pas (ou plutôt – ce que vous ne lui avez pas demandé de faire).

Donc soit:

  • vous voulez réellement que le nouvel élément soit dans l’espace de noms Microsoft – auquel cas vous devez l’indiquer. Le moyen le plus simple consiste à utiliser createElement et à fournir l’espace de noms, bien que vous puissiez probablement le déclarer explicitement avec un atsortingbut xmlns sur votre InnerXml (ce qui n’est pas un moyen particulièrement agréable d’append des nœuds).

  • Vous voulez vraiment cet élément dans l’espace de noms null, auquel cas il vaut probablement mieux qualifier tous les autres nœuds qui ne sont pas dans l’espace de noms null avec un préfixe d’espace de nommage.

Je suppose que vous voulez l’ancien.

Un aperçu rapide des espaces de noms peut être trouvé ici .