XPathNavigator в Silverlight - PullRequest
       12

XPathNavigator в Silverlight

1 голос
/ 14 марта 2010

У меня есть библиотека кода, которая интенсивно использует 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'), я возвращаюсь к сохраненным закладкам (используя эти сохраненные XPathNavigators) и завершаю синтаксический анализ.

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

Вопросы:

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

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

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

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

Ответы [ 3 ]

1 голос
/ 15 марта 2010

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

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

  • Продолжайте переписывать код, используя XDocument, XElement и т. Д. Из пространства имен System.Xml.Linq. Это может быть не такой плохой выбор, как вы думаете.
  • Оберните объекты Xml-to-Linq в вашу собственную реализацию тех свойств и методов XPathNavigator, которые вы фактически используете. Не должно быть слишком сложно воссоздать большинство функций XPathNavigator для объектов Xml-to-Linq. Затем вы можете запустить существующий код для своего собственного XPathNavigator.
1 голос
/ 22 апреля 2010

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

0 голосов
/ 15 марта 2010

Есть множество способов: Как работать с XML в C #

Вы по-прежнему можете использовать Linq to XML, только минус синтаксис linq и использовать методы расширения Linq.

...