XPathNavigator в Silverlight

У меня есть библиотека кода, которая интенсивно использует XPathNavigator для анализа определенного XML-документа. На XML-документ есть перекрестные ссылки, что означает, что элемент может ссылаться на другой, который еще не встречался во время синтаксического анализа:

<ElementA ...>
    <DependentElementX id="1234">
</ElementA>

<ElementX id="1234" .../>

Документ на самом деле не выглядит так, но дело в том, что 1) существует XML-схема, которая обеспечивает общую структуру документа, 2) элементы внутри документа могут ссылаться друг на друга, используя некоторые идентификаторы, и 3) существует довольно несколько таких перекрестных ссылок между различными элементами в документе.

Документ разбирается в два этапа. В первом проходе я просматриваю документ

XPathDocument doc = ...;
XPathNavigator nav = doc.CreateNavigator();
nav.MoveToRoot();
nav.MoveToFirstChild()...

и иногда «закладывать» текущую позицию (элемент) в документе с помощью метода XPathNavigator.Clone (). Это дает мне легкий экземпляр XPathNavigator, который я могу где-то сохранить и использовать позже, чтобы вернуться к определенному месту (элементу) в моем документе.

Как только у меня будет достаточно информации, собранной на первом проходе (например, я убедился, что действительно существует ElementX с id = '1234'), я перехожу к сохраненным закладкам (используя сохраненные XPathNavigator) и завершаю синтаксический анализ.

Что ж, теперь я собираюсь использовать эту библиотеку в Silverlight 3.0, и, к моему ужасу, XPathNavigator отсутствует в сборке System.Xml.

Вопросы:

1) Мне не хватает чего-то очевидного (например, XPathNavigator существует в какой-то форме или форме, например, в наборе инструментов или в бесплатной библиотеке)?

2) Если мне нужно внести изменения в код, что будет лучше всего? В идеале я хотел бы внести минимальные изменения, а не переписывать 80% кода только для того, чтобы иметь возможность использовать что-то вроде XLinq.

Чтобы продолжить, в случае, если мне придется отказаться от XPathNavigator, все, что мне нужно, - это способ пометить места в моем документе и вернуться к ним, чтобы я мог продолжить итерацию с того места, где я остановился.

Заранее благодарим за любую помощь / идеи.


person vladimir    schedule 14.03.2010    source источник
comment
У тебя не может быть всего. Сколько различных способов синтаксического анализа XML следовало оставить Microsoft в структуре SilverLight?   -  person John Saunders    schedule 14.03.2010
comment
IIRC, платформа .NET поставляется с двумя реализациями XPathNavigator, одна из которых работает со стандартной реализацией W3C DOM (XmlNode), а другая - с XPathDocument. XPathDocument доступен в Silverlight, поэтому я не совсем уверен, почему XPathNavigator там тоже нет ..?   -  person vladimir    schedule 14.03.2010
comment
Неправильно, XPathDocument там тоже нет. Думаю, мне придется существенно изменить код.   -  person vladimir    schedule 14.03.2010


Ответы (3)


Вы не упускаете ничего очевидного, в версиях библиотек Silverlight нет реализации XPathNavigator или XPathDocument.

«Наилучший вариант» очень субъективен и действительно будет зависеть от того, сколько строк кода действительно зависит от XPathNavigator. Однако я вижу несколько вариантов.

  • Перепишите код, используя XDocument, XElement и т. Д. Из имени System.Xml.Linq. Возможно, это не такой уж плохой выбор, как вы думаете.
  • Оберните объекты Xml-to-Linq в вашу собственную реализацию тех свойств и методов XPathNavigator, которые вы фактически используете. Не должно быть слишком сложно воссоздать большинство функций XPathNavigator по отношению к объектам Xml-to-Linq. Затем вы можете запустить существующий код против своего собственного XPathNavigator.
person AnthonyWJones    schedule 14.03.2010
comment
Спасибо, Энтони, оба предложения верны. В настоящее время я склоняюсь к использованию XDocument / XElement, но в основном потому, что я незнаком с XLinq. В любом случае мне кажется, что мне придется отказаться от проверки документов с использованием моей схемы XSD, если мне не удастся преобразовать ее (правильно!) В dtd. - person vladimir; 15.03.2010
comment
@Vladimir: Мне лично сложно отделить XDocument / XElement от XLinq, поскольку методы расширения, описывающие эту функцию, находятся в том же пространстве имен, что и XDocument. - person AnthonyWJones; 15.03.2010
comment
правда, разделения, которое я использовал, не существует. - person vladimir; 15.03.2010

XPath (xdoc.XPathSelectElements) доступен в Silverlight 4: здесь онлайн-инструмент для тестирования.

person Chris S    schedule 22.04.2010