/ / Inserimento stringa XML "raw" in XElement - c #, linq, xelement

Inserimento di una stringa XML "raw" in XElement - c #, linq, xelement

Sto cercando di caricare un nodo (in formato stringa) in un XElement. Anche se questo dovrebbe essere abbastanza facile sto trovando alcuni problemi:

  • Il nodo che sto cercando di caricare contiene riferimenti a spazi dei nomi in alcuni sottonodi
  • Quando cerco di usare XElement.Load() o Xelement.Parse() Ottengo l'errore dello spazio dei nomi previsto non definito

So che la soluzione è creare un ambientenodo con le definizioni dello spazio dei nomi e quindi caricare l'intera cosa, ma mi chiedevo se c'è una soluzione più elegante che non coinvolge le operazioni con le stringhe.

Ecco il mio tentativo fallito :(

Ho una collezione di attributi namespace:

private readonly List<XAttribute> _namespaces;

Questo è già popolato e contiene tutti gli spazi dei nomi necessari. Quindi, per incorporare la mia stringa XML in un altro nodo, stavo facendo questo:

var temp = new XElement("root", (from ns in _namespaces select ns), MyXMLString);

Ma come mi aspettavo, il contenuto di MyXMLString viene sfuggito e diventa un nodo di testo. Il risultato che ottengo è qualcosa del tipo:

<root xmlns:mynamespace="http://mynamespace.com">&lt;mynamespace:node&gt;node text&lt;/node&gt;</root>

E il risultato che sto cercando è:

<root xmlns:mynamespace="http://mynamespace.com">
<mynamespace:node>node text</node>
</root>

C'è un modo carino per fare questo?

Grazie in anticipo

risposte:

5 per risposta № 1

Presumibilmente il tuo testo XML è in realtà ben formato (nota il qualificatore namespace sul tag di chiusura):

var xml = "<mynamespace:node>node text</mynamespace:node>";

In questo caso puoi usare questo per specificare manualmente gli spazi dei nomi:

var mngr = new XmlNamespaceManager( new NameTable() );
mngr.AddNamespace( "mynamespace", "urn:ignore" ); // or proper URL
var parserContext = new XmlParserContext(null, mngr, null, XmlSpace.None, null);

Ora leggi e carica:

var txtReader = new XmlTextReader( xml, XmlNodeType.Element, parserContext );
var ele = XElement.Load( txtReader );

Funziona come previsto. E non hai bisogno di un nodo "radice" del wrapper. Ora questo può essere inserito in qualsiasi come un XElement in qualunque posto.