我有一个代码库,它大量使用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),我会跳回已保存的书签(使用那些保存的XPathNavigators)并完成解析。
好吧,现在我要在Silverlight 3.0中使用这个库,令我惊恐的是XPathNavigator不在System.Xml程序集中。
问题:
1)我错过了一些明显的东西(例如,XPathNavigator确实以某种形式或形式存在,例如在工具包或免费软件库中)?
2)如果我必须在代码中进行修改,那么最好的方法是什么?理想情况下,我想进行 minimal 更改,而不是重写80%的代码只是为了能够使用像XLinq这样的东西。
要恢复,如果我不得不放弃XPathNavigator,我需要的只是一种方法来记录我的文档中的位置并回到它们,以便我可以继续从我离开的位置进行迭代。
提前感谢任何帮助/想法。
答案 0 :(得分:1)
你不会遗漏一些明显的东西,在Silverlight版本的库中没有XPathNavigator或XPathDocument的实现。
“最好的方法”是高度主观的,并且实际上取决于XPathNavigator
真正依赖的代码行数。但是我看到了几个选择。
XPathNavigator
属性和方法的实现中包装Xml-to-Linq对象。对于Xml-to-Linq对象重新创建XPathNavigator
的大部分功能应该不会太难。然后,您可以针对自己的XPathNavigator
运行现有代码。答案 1 :(得分:1)
XPath(xdoc.XPathSelectElements
)在Silverlight 4:here's an online测试工具中可用。
答案 2 :(得分:0)
有很多方法: How to deal with XML in C#
您仍然可以使用Linq to XML,只需减去linq语法并使用Linq Extension方法。