Regradation de ce code:
var tmpNewNode = xdoc.ImportNode(newNode, true); if (oldNode.ParentNode != null) { oldNode.ParentNode.ReplaceChild(tmpNewNode, oldNode); return true; }
6 Réponses :
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. P>
+1: Utilisation de string.replace code> pour supprimer
xmlns = "" code> 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 = "" code> réalise la validation du document XML.
Ajouter un espace de noms par défaut à votre xdoc p>
Le long des lignes de ce que MarkXa a déclaré : P >
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. P> blockQuote>
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. P>
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. P>
J'ai eu le problème de Sames lorsque j'ai créé un xmelement comme ici 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);
Essayez:
oldNode.InnerXml = tmpNewNode.InnerXml
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. p>
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.