У меня есть библиотека кода, которая интенсивно использует 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, все, что мне нужно, это способ пометить места в моем документе и вернуться к ним, чтобы я мог продолжить итерацию с того места, где остановился.
Заранее спасибо за любую помощь / идеи.