У меня есть 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.
Меня все еще интересует реальный ответ, если у кого-то есть.