/ / Вмъкване на "суров" XML низ в XElement - c #, linq, xelement

Вмъкване на "суров" XML низ в XElement - c #, linq, xelement

Опитвам се да заредим възел (в струнен формат) в XElement. Въпреки, че това трябва да е достатъчно лесно, ще намеря някои проблеми:

  • Възелът, който се опитвам да заредя, съдържа препратки в пространството от имена в някои под-възли
  • Когато се опитвам да използвам XElement.Load() или Xelement.Parse() Получавам очакваната ненасочена грешка в областта на имената

Знам, че решението е да се създаде обкръжениевъзел с дефинициите на пространството на имената и след това заредете цялото нещо, но се чудех дали има по-елегантно решение, което не включва операции с низове.

Тук е моят неуспешен опит :(

Имам колекция от атрибути на пространството на имена:

private readonly List<XAttribute> _namespaces;

Това вече е попълнено и съдържа всички необходими пространства за имена. Така че, за да вградя моя XML низ в друг възел, аз правех това:

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

Но както очаквах, съдържанието на MyXMLString се измъква и става текстов възел. Резултатът, който получавам, е нещо като:

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

И резултатът, който търся, е:

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

Има ли ясен начин да направите това?

Благодаря предварително

Отговори:

5 за отговор № 1

Вероятно вашият XML текст всъщност е добре оформен (обърнете внимание на квалификатора на пространството за имена на заключителния маркер):

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

В този случай можете да използвате това, за да посочите ръчно пространствата за имена:

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

Сега прочетете и заредете:

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

Работи според очакванията. И вие нямате нужда от обвивка "корен" възел. Сега това може да се вмъкне в някоя като XElement навсякъде.