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()
oXelement.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"><mynamespace:node>node text</node></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 № 1Presumibilmente 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.