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()
aleboXelement.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"><mynamespace:node>node text</node></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ď č. 1Váš 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.