/ / Vloženie „surového“ XML reťazca do XElement - c #, linq, xelement

Vloženie „surového“ XML reťazca do XElement - c #, linq, xelement

Snažím sa načítať uzol (vo formáte reťazca) do XElementu. Aj keď by to malo byť dosť jednoduché, musím nájsť nejaké problémy:

  • Uzol I, ktorý sa pokúša načítať, obsahuje odkazy na menný priestor v niektorých poduzlovkách
  • Keď sa pokúšam použiť XElement.Load() alebo Xelement.Parse() Dostanem očakávanú chybu, ktorá nebola definovaná

Viem, že riešením je vytvoriť okolieuzol s definíciami menného priestoru a potom nahrať celú vec, ale zaujímalo by ma, či existuje elegantnejšie riešenie, ktoré nezahŕňa operácie s reťazcami.

Tu je môj neúspešný pokus: (

Mám kolekciu atribútov menného priestoru:

private readonly List<XAttribute> _namespaces;

Toto je už obsadené a obsahuje všetky potrebné menné priestory. Ak chcete vložiť reťazec XML do iného uzla, ktorý som robil:

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

Ale ako som tiež očakával, obsah MyXMLString unikne a stane sa textovým uzlom. Výsledok, ktorý dostanem, je niečo ako:

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

A výsledok, ktorý hľadám, je:

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

Je to pekný spôsob, ako to urobiť?

Vopred ďakujem

odpovede:

5 pre odpoveď č. 1

Váš text XML je pravdepodobne dobre vytvorený (poznamenajte si kvalifikátor priestoru názvov na koncovej značke):

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

V takom prípade môžete použiť na manuálne zadanie menných priestorov:

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

Prečítať a načítať:

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

Pracuje podľa očakávania. A nepotrebujete uzol "root". Teraz to môže byť vložené do ľubovoľného ako XElement kdekoľvek.