Silverlight中的XPathNavigator

时间:2010-03-14 18:59:20

标签: silverlight xpathnavigator

我有一个代码库,它大量使用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,我需要的只是一种方法来记录我的文档中的位置并回到它们,以便我可以继续从我离开的位置进行迭代。

提前感谢任何帮助/想法。

3 个答案:

答案 0 :(得分:1)

你不会遗漏一些明显的东西,在Silverlight版本的库中没有XPathNavigator或XPathDocument的实现。

“最好的方法”是高度主观的,并且实际上取决于XPathNavigator真正依赖的代码行数。但是我看到了几个选择。

  • 继续使用System.Xml.Linq namepsace中的XDocument,XElement等重新编写代码。这可能不像你想象的那么糟糕。
  • 在您自己实现的实际使用的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方法。