12
votes

ImporTnode crée un attribut xmlns vide

Regradation de ce code:

   var tmpNewNode = xdoc.ImportNode(newNode, true);

    if (oldNode.ParentNode != null)
    {
        oldNode.ParentNode.ReplaceChild(tmpNewNode, oldNode);
        return true;
    }


3 commentaires

Pourquoi le XMLNS attribue-t-il un problème pour vous?


J'effectue des comparaisons de chaîne. Je dois éviter d'être généré.


J'ai essayé de reproduire votre problème, mais l'attribut XMLNS n'a pas été créé après avoir utilisé ImportNode et l'a remplacé. Je pense que le problème est lié à la manière dont vous créez le xmldocument et comment vous obtenez NouveauNode. Je vous suggère d'ajouter plus de détails et d'une image plus complète du code.


6 Réponses :


8
votes

Qu'est-ce qui se passe probablement ici est que newnode provient d'un document sans espace de noms déclaré, mais oldnode est dans un document avec un espace de noms. Dans cette situation, le nœud prend son espace de noms vierge sur le nouveau document et il apparaît explicitement. Pour être honnête, si ce n'est qu'un problème pour une comparaison de chaîne, il ne vous fera pas mal de simplement supprimer toutes les instances de XMLNS = "" de la chaîne XML avant de travailler avec elle.


3 commentaires

+1: Utilisation de string.replace pour supprimer xmlns = "" se sent un peu maladroit pour moi, mais plus d'utiliser une comparaison de chaîne brute sur une chaîne XML.


D'accord, c'est un peu une odeur de code, mais essayant de faire une comparaison de nœuds par nœud de deux arbres XML est un pita, je peux donc voir pourquoi la comparaison de l'OUTERXML pourrait être préférable.


Solution laide, mais je suppose que ça marche ... Je suis tombé sur le même problème dans PowerShell. Dans mon cas, faire une automatisation contre l'API Microsoft Azure signifie que le xmlns = "" réalise la validation du document XML.



-1
votes

Ajouter un espace de noms par défaut à votre xdoc


0 commentaires

0
votes

Le long des lignes de ce que MarkXa a déclaré :

Qu'est-ce qui se passe probablement ici est que Newnode vient d'un document sans Espace de noms déclarée, mais oldnode est dans un document avec un espace de noms. Dans ce situation, le nœud prend son blanc Espace de noms sur le nouveau document et Il apparaît explicitement.

Vous pouvez manipuler la chaîne dans le but de la comparaison, mais les nœuds de votre DOM ne seraient pas un espace de noms qualifié correctement, ce qui pourrait vous causer des problèmes plus tard si vous avez essayé de l'utiliser.

La solution correcte serait de construire Nouveaunode avec la qualification d'espace de noms approprié en premier lieu. Par qualification des espaces de réponses des propres, je veux dire les espaces de noms utilisés dans l'importateur DOM.


0 commentaires

0
votes

J'ai eu le problème de Sames lorsque j'ai créé un xmelement comme ici xxx pré>

après cela, j'ai reçu l'attribut xmlns = "" après l'enregistrement. P>

Si j'utilise le Espace de noms du document Je pourrais supprimer cet attribut XMLNS. P>

XmlElement xmlElement = myXmlDocument.CreateElement("MyElemenent",myXmlDocument.DocumentElement.NamespaceURI);
myXmlDocument.AppendChild(xmlElement);


0 commentaires

0
votes

Essayez:

oldNode.InnerXml = tmpNewNode.InnerXml


0 commentaires

0
votes

Enfin j'ai résolu ce fichier XML ouverte et remplacer toutes les occurrences de xmlns "" avec une chaîne vide.

Peut-être sa solution non élégante mais sa simple et fonctionne bien. xxx


0 commentaires