2010-12-02 13 views
8

Declassamento questo codice:ImportNode crea xmlns vuoto attributo

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

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

tmpNewNode viene creato con l'attributo xmlns vuoto (xmlns = ""). Qualche suggerimento come posso evitarlo?

10x

+0

Perché gli attributi xmlns rappresentano un problema? –

+0

Sto eseguendo un confronto tra stringhe. Devo evitare che venga generato. – Guy

+0

Come viene creato 'newNode'? – Richard

risposta

8

Cosa sta probabilmente accadendo qui è che newNode proviene da un documento senza namespace dichiarato, ma oldnode è in un documento con uno spazio dei nomi. In questa situazione, il nodo prende il suo spazio dei nomi vuoto sul nuovo documento e viene mostrato esplicitamente. Per essere onesti, se è solo un problema per un confronto tra stringhe, non farà male rimuovere semplicemente tutte le istanze di xmlns = "" dalla stringa XML prima di lavorarci.

+0

+1: Usare 'String.Replace' per rimuovere' xmlns = "" 'sembra un po 'imbarazzante per me, ma non più che usare il confronto delle stringhe raw su una stringa XML. – Brian

+0

D'accordo, è un po 'un odore di codice, ma provare a fare un confronto nodo per nodo di due alberi XML è un PITA, quindi posso capire perché il confronto con OuterXML potrebbe essere preferibile. – MarkXA

+1

Soluzione brutta, ma immagino che funzioni ... Ho incontrato lo stesso problema in PowerShell. Nel mio caso, fare automazione contro le API di Microsoft Azure significa che 'xmlns =" ​​"' interrompe effettivamente la convalida del documento XML. –

-1

add default namespace al xdoc

0

Lungo le linee di quello che MarkXA said:

Cosa sta probabilmente accadendo qui è che newNode proviene da un documento senza namespace dichiarato, ma oldnode è in un documento con uno spazio dei nomi. In questa situazione , il nodo prende lo spazio dei nomi vuoto sul nuovo documento e lo viene visualizzato esplicitamente.

È possibile manipolare la stringa ai fini del confronto ma i nodi nel DOM non sarebbero stati correttamente qualificati nello spazio dei nomi, il che potrebbe causare problemi in seguito se si è tentato di utilizzarlo.

La soluzione corretta sarebbe quella di creare newNode con la qualifica namespace appropriata in primo luogo. Per qualifica di namespace, intendo gli spazi dei nomi usati nel DOM di importazione.

0

ho avuto il problema sames quando ho creato un XmlElement come qui

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

dopo questo ho avuto l'attributo xmlns = "" dopo il salvataggio.

Se utilizzo lo spazio dei nomi del documento, potrei eliminare questo attributo xmlns.

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

Senza i xmlns vuoti = "" i miei SelectNodes non ha funzionato più perché lo spazio dei nomi deve essere specificato. Soluzione per questo è here (using-xpath-with-default-namespace)

0

Prova:

oldNode.InnerXml = tmpNewNode.InnerXml 
0

Infine ho risolto questo file XML apertura e sostituire tutte le occorrenze dei xmlns "" con una stringa vuota.

Forse la sua soluzione non elegante ma è semplice e funziona bene.

//remove void xmlns 
File.WriteAllText(filename, Regex.Replace(File.ReadAllText(filename), "xmlns=\"\"", ""));