Можно ли получить исходный XML из XPathNavigator?

У меня есть XML-документ, я хочу сделать подсветку синтаксиса.

В коде используется XPathDocument, XPathNavigator и XPathNodeIterator . После вызова Select() , как я могу получить исходный текст в XML-документе?

var xpathDoc = new XPathDocument(new StringReader(this.richTextBox1.Text));
var nav = xpathDoc.CreateNavigator();
XmlNamespaceManager xmlns = new XmlNamespaceManager(nav.NameTable);
xmlns.AddNamespace("ns1", "urn:myxnlnamespace");
XPathNodeIterator selection = nav.Select(xpathExpression, xmlns);

foreach (XPathNavigator node in selection)
{
   // Here, node.OuterXml includes an explicit namespace.
   // If the original raw xml fragment for this node was
   //    <ElementName>Text</ElementName>
   // and if xmlns="urn:myxnlnamespace" is used on the root of the document....
   //
   // OuterXml will return
   //    <ElementName xmlns="urn:myxnlnamespace">Text</ElementName>
   //
   // InnerXml will return "Text" in this example. 
   // 
   // How can I get the original, raw XML bytestream for this node?
   // Like this:
   //    <ElementName>Text</ElementName>
   //
}

Для меня также сработало бы получение IXmlLineInfo как начала, так и конца выбранного узла. Прямо сейчас я могу перейти к началу выбранного узла и получить для этого IXmlLineInfo. Но я знаю только, как перейти к следующему узлу (MoveToNext()); Не знаю, как перейти в конец текущего узла. Также этот подход не работает, если рассматриваемый узел является последним в последовательности (больше нет братьев и сестер).

Это также будет работать, если есть какое-то выражение xpath, которое возвращает полный необработанный текст текущего узла. Я пока тоже не могу найти что-то подобное.


EDIT: я преодолел эту проблему с помощью бессовестного взлома. Чтобы определить длину текста, который мне нужно выделить, я анализирую исходный текст xml вручную, ища угловые скобки и токены имен. Это не красиво, но в отсутствие чего-то лучшего, это работает для простых файлов XML.

Меня все еще интересует реальный ответ, если у кого-то есть.


person Cheeso    schedule 17.09.2009    source источник
comment
@Cheeso Я не думаю, что для этого есть значительно лучшее решение, чем то, что IE предлагал в течение последних 9-10 лет. Вот почему я рекомендую способ сделать это с помощью визуализатора XPath, который по сути является адаптацией таблицы стилей IE, так что теперь она написана в совместимом XSLT 1.0 (а не в старом диалекте Microsoft xsl).   -  person Dimitre Novatchev    schedule 18.09.2009
comment
Создает ли этот подход HTML? Как мне затем применить выделение к набору узлов в XML-документе?   -  person Cheeso    schedule 18.09.2009
comment
Как я уже сказал в своем ответе, изучайте код визуализатора XPath! :) Если вы боитесь получить XPath Visualizer с сайта topxml.com (на сайте полно троянов!!!), свяжитесь со мной по адресу dnovatchev at gmail dot com   -  person Dimitre Novatchev    schedule 19.09.2009
comment
Я заметил там трояны....   -  person Cheeso    schedule 19.09.2009


Ответы (1)


Вы можете найти полезным то, как визуализатор XPath выполняет подсветку синтаксиса XML-документа.

person Dimitre Novatchev    schedule 18.09.2009
comment
Спасибо, Димитр. Ваш инструмент существует очень давно, а? Я хотел свой собственный, поэтому я его построил. XpathVisualizer.codeplex.com Я столкнулся с этим вопросом, пытаясь заставить работать выделение. - person Cheeso; 18.09.2009
comment
@Cheeso Я не думаю, что для этого есть значительно лучшее решение, чем то, что IE предлагал в течение последних 9-10 лет. Вот почему я рекомендую способ сделать это с помощью визуализатора XPath, который по сути является адаптацией таблицы стилей IE, так что теперь она написана в совместимом XSLT 1.0 (а не в старом диалекте Microsoft xsl). - person Dimitre Novatchev; 18.09.2009