2 votes

L'insertion d'un élément dans xml produit une propriété inutile xmlns=.

Chaque fois que j'insère un élément dans mon document xml, le système lui ajoute un attribut xmlns="". Comment puis-je m'en débarrasser ? Pourquoi est-il là ? J'utilise un linqtoxml très simple.

J'ai un fichier XML simple (Notez qu'il n'y a pas de ligne de déclaration Xml et qu'il contient un espace de noms) :

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <PropertyGroup>
  </PropertyGroup>
</Project>

Je procède comme suit :

        //  1. Read in the Xml file
        XDocument testXml = XDocument.Load(@"C:\test.xml");

        //  2. Add in the extra node
        XNamespace ns = testXml.Root.Attribute("xmlns").Value;          // Get the existing namespace
        XElement newElement = new XElement("MyNewElement", "12345");    // Create the new element
        testXml.Element( ns + "Project").Add( newElement );          // Insert the new element into the document

        //  3. Write To Disk (without the xml header line)
        TextWriter tw = File.CreateText(@"C:\test2.xml");
        tw.Write(testXml.ToString());
        tw.Close();

Lors de l'affichage du fichier, j'obtiens :

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <PropertyGroup></PropertyGroup>
  <MyNewElement xmlns="">12345</MyNewElement>
</Project>

Je dois me débarrasser de l'élément xmlns="". Je pense qu'il faut inclure l'espace de noms lors de l'ajout d'un nouvel élément parce que le document d'origine a un espace de noms. J'ai essayé d'insérer l'élément avec :

    testXml.Element( "Project").Add( newElement );

Mais je n'ai cessé de recevoir une exception de référence nulle, et je suppose que c'est parce que l'élément a besoin du nom de l'espace de noms.

J'ai pensé à l'analyser une deuxième fois et à supprimer toutes les propriétés xmlns="", mais cela ne semble pas fonctionner ; je continue à obtenir l'exception de la référence nulle. Il y a probablement une compréhension fondamentale des espaces de noms qui me manque ici, mais j'ai regardé autour de moi et je n'ai pas l'impression de trouver des indices.

Quelqu'un peut-il m'indiquer la bonne direction à suivre ?

Santé Jack.

1voto

Not Sure Points 3128

XmlNs est "XML NameSpace" - en gros, l'idée est la même que les espaces de noms C++, les packages Java/C#, etc, sauf qu'il s'agit d'analyser des données variables. Schémas XML (par exemple XSD, DTD).

Vous créez MyNewElement sans spécifier son espace de noms, de sorte que votre arbre DOM l'interprète comme l'espace de noms vide. Puisque la racine de votre document spécifie un espace de noms non vide, la déclaration xmlns="" qu'il insère est correcte selon votre code. Vous devez spécifier l'espace de noms sur votre MyNewElement avant de l'ajouter au document d'une manière ou d'une autre. Je ne connais pas l'API XML LinQ, mais je sais que dans une version antérieure des analyseurs XML .Net, la pratique recommandée était d'utiliser un élément CreateElement() à partir d'un XmlDocument pour hélitreuiller correctement dans ces conditions.

Sur la base du code de consultation de l'élément Project, et ne connaissant pas du tout LinQ, essayez de changer :

XElement newElement = new XElement("MyNewElement", "12345");

à :

XElement newElement = new XElement(ns + "MyNewElement", "12345");

1voto

tuinstoel Points 6329

Ce n'est pas une réponse à la question mais je voulais quand même vous le dire.

Vous pouvez enregistrer un document xdocument dans un fichier à l'aide de la méthode save :

XDocument testXml = XDocument.Load(@"C:\test.xml");
...
testXml.Save(@"c:\test.xml"); 

Il n'est pas nécessaire d'utiliser un TextWriter.

0voto

adel Points 41

Vous devez mettre intentionnellement votre espace de noms dans la chaîne xml comme :

<serveur nom='nouveau serveur'  xmlns='urn:myLogConfig'>

et l'enlever dans le code : (vb)

myXelement.SetAttributeValue("xmlns", Nothing)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X