Опитвам се да заредим възел (в струнен формат) в 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"><mynamespace:node>node text</node></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
навсякъде.