我有一个代码库,它大量使用 XPathNavigator 来解析一些特定的 xml 文档。xml 文档是交叉引用的,这意味着一个元素可以引用另一个在解析期间尚未遇到的元素:
<ElementA ...>
<DependentElementX id="1234">
</ElementA>
<ElementX id="1234" .../>
文档看起来并不像这样,但重点是 1) 有一个 xml 模式可以强制执行整个文档结构,2) 文档中的元素可以使用一些 ID 相互引用,3) 有相当多的文档中不同元素之间很少有这样的交叉引用。
文档分两个阶段进行解析。在第一遍中,我浏览了文档
XPathDocument doc = ...;
XPathNavigator nav = doc.CreateNavigator();
nav.MoveToRoot();
nav.MoveToFirstChild()...
偶尔会使用 XPathNavigator.Clone() 方法为文档中的当前位置(元素)添加书签。这给了我一个轻量级的 XPathNavigator 实例,我可以将它存储在某个地方,然后使用它跳回到我文档中的特定位置(元素)。
一旦我在第一遍中收集了足够的信息(例如,我确定确实有一个 id='1234' 的 ElementX),我跳回保存的书签(使用那些保存的 XPathNavigator)并完成解析。
好吧,现在我将在 Silverlight 3.0 中使用这个库,令我恐惧的是 XPathNavigator 不在 System.Xml 程序集中。
问题:
1) 我是否遗漏了一些明显的东西(即 XPathNavigator 确实以某种形式或形式存在,例如在工具包或免费软件库中)?
2)如果我必须对代码进行修改,最好的方法是什么?理想情况下,我希望进行最小的更改,而不是为了能够使用 Xlinq 之类的东西而重写 80% 的代码。
要恢复,万一我不得不放弃 XPathNavigator,我所需要的只是一种方法来为我的文档中的位置添加书签并返回到它们,以便我可以从我离开的地方继续迭代。
提前感谢您的任何帮助/想法。