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