Question

Les méthodes XmlElement.Attributes.Remove * fonctionnent correctement pour les attributs arbitraires, ce qui entraîne la suppression des attributs supprimés de la propriété XmlDocument.OuterXml. L'attribut Xmlns est cependant différent. Voici un exemple:

XmlDocument doc = new XmlDocument();
doc.InnerXml = @"<Element1 attr1=""value1"" xmlns=""http://mynamespace.com/"" attr2=""value2""/>";
doc.DocumentElement.Attributes.RemoveNamedItem("attr2");
Console.WriteLine("xmlns attr before removal={0}", doc.DocumentElement.Attributes["xmlns"]);
doc.DocumentElement.Attributes.RemoveNamedItem("xmlns");
Console.WriteLine("xmlns attr after removal={0}", doc.DocumentElement.Attributes["xmlns"]);

Le résultat obtenu est

xmlns attr before removal=System.Xml.XmlAttribute
xmlns attr after removal=
<Element1 attr1="value1" xmlns="http://mynamespace.com/" />

L'attribut semble avoir été supprimé de la collection Attributes, mais pas de XmlDocument.OuterXml. Je suppose que c'est à cause de la signification particulière de cet attribut.

La question est de savoir comment supprimer l'attribut xmlns à l'aide de l'API XML .NET. Évidemment, je peux simplement supprimer l'attribut d'une représentation sous forme de chaîne, mais je me demande s'il est possible de faire la même chose en utilisant l'API.

@Edit: je parle de .NET 2.0.

Était-ce utile?

La solution

L'API .NET DOM ne prend pas en charge la modification de l'espace de nom de l'élément, ce que vous essayez essentiellement de faire. Donc, pour résoudre votre problème, vous devez construire un nouveau document d’une manière ou d’une autre. Vous pouvez utiliser la même API .NET DOM et créer un nouvel élément sans spécifier son espace de nom. Vous pouvez également créer une feuille de style XSLT qui transforme votre " namespaced " d'origine " document vers un nouveau dans lequel les éléments ne seront pas qualifiés par un espace de nom.

Autres conseils

J'ai vu les différentes options de ce fil de discussion et je viens de résoudre ma propre solution pour supprimer les attributs xmlns dans xml. Cela fonctionne correctement et ne pose aucun problème:

'Remove the Equifax / Transunian / Experian root node attribute that have xmlns and load xml without xmlns attributes.
If objXMLDom.DocumentElement.NamespaceURI <> String.Empty Then
  objXMLDom.LoadXml(objXMLDom.OuterXml.Replace(objXMLDom.DocumentElement.NamespaceURI, ""))
  objXMLDom.DocumentElement.RemoveAllAttributes()
  ResponseXML = objXMLDom.OuterXml
End If

Il n'est pas nécessaire de faire autre chose pour supprimer xmlns de xml.

Merci beaucoup à Ali Shah, ce fil a parfaitement résolu mon problème! voici une conversion en C #:

var dom = new XmlDocument();
        dom.Load("C:/ExampleFITrade.xml));
        var loaded = new XDocument();
        if (dom.DocumentElement != null)
            if( dom.DocumentElement.NamespaceURI != String.Empty)
            {
                dom.LoadXml(dom.OuterXml.Replace(dom.DocumentElement.NamespaceURI, ""));
                dom.DocumentElement.RemoveAllAttributes();
                loaded = XDocument.Parse(dom.OuterXml);
            }

N'était-ce pas supposé supprimer les espaces de noms?

XmlNamespaceManager mgr = new XmlNamespaceManager("xmlnametable");
mgr.RemoveNamespace("prefix", "uri");

Mais de toute façon sur une tangente ici, le XElement, le XDocument et XNameSpace , les classes de l'espace de noms System.Xml.Linq (.Net 3.0) sont meilleures que l'ancien modèle XmlDocument. Essayez. Je suis accro.

public static string RemoveXmlns(string xml)
{
    //Prepare a reader
    StringReader stringReader = new StringReader(xml);
    XmlTextReader xmlReader = new XmlTextReader(stringReader);
    xmlReader.Namespaces = false; //A trick to handle special xmlns attributes as regular
    //Build DOM
    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.Load(xmlReader);
    //Do the job
    xmlDocument.DocumentElement.RemoveAttribute("xmlns"); 
    //Prepare a writer
    StringWriter stringWriter = new StringWriter();
    XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter);
    //Optional: Make an output nice ;)
    xmlWriter.Formatting = Formatting.Indented;
    xmlWriter.IndentChar = ' ';
    xmlWriter.Indentation = 2;
    //Build output
    xmlDocument.Save(xmlWriter);
    return stringWriter.ToString();
}

Oui, comme il s’agit d’un nom ELEMENT, vous ne pouvez pas le supprimer explicitement. L'utilisation de WriteStartElement et WirteStartAttribute de XmlTextWriter et le remplacement de l'attribut par des espaces vides permettront probablement à la tâche d'être effectuée.

Je vérifie maintenant. mettra à jour.

Peut-être par le biais du XmlNamespaceManager? http://msdn.microsoft.com/en- us / library / system.xml.xmlnamespacemanager.removenamespace.aspx , mais ce n'est qu'une supposition.

Nous pouvons convertir le xml en une chaîne, supprimer les xmlns de cette chaîne, puis créer un autre XmlDocument à l'aide de cette chaîne, qui n'aura pas d'espace de nom.

voici ma solution sur vb.net les gars!

   Dim pathXmlTransformado As String = "C:\Fisconet4\process\11790941000192\2015\3\28\38387-1\38387_transformado.xml"
    Dim nfeXML As New XmlDocument
    Dim loaded As New XDocument

    nfeXML.Load(pathXmlTransformado)

    nfeXML.LoadXml(nfeXML.OuterXml.Replace(nfeXML.DocumentElement.NamespaceURI, ""))
    nfeXML.DocumentElement.RemoveAllAttributes()

    Dim dhCont As XmlNode = nfeXML.CreateElement("dhCont")
    Dim xJust As XmlNode = nfeXML.CreateElement("xJust")
    dhCont.InnerXml = 123
    xJust.InnerXml = 123777

    nfeXML.GetElementsByTagName("ide")(0).AppendChild(dhCont)
    nfeXML.GetElementsByTagName("ide")(0).AppendChild(xJust)

    nfeXML.Save("C:\Fisconet4\process\11790941000192\2015\3\28\38387-1\teste.xml")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top