1

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

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

4

3 回答 3

1

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

“最好的方法”是非常主观的,实际上取决于有多少行代码真正依赖于XPathNavigator. 但是我看到了几个选择。

  • 继续使用 System.Xml.Linq 命名空间中的 XDocument、XElement 等重新编写代码。这可能不像您想象的那么糟糕。
  • 将 Xml-to-Linq 对象包装在您自己的XPathNavigator实际使用的那些属性和方法的实现中。XPathNavigator重新创建针对 Xml-to-Linq 对象的大多数功能应该不会太难。然后,您可以针对您自己的XPathNavigator.
于 2010-03-14T21:37:51.703 回答
1

XPath ( xdoc.XPathSelectElements) 在 Silverlight 4 中可用:这是一个在线测试工具。

于 2010-04-22T19:27:47.480 回答
0

有很多方法: 如何在 C# 中处理 XML

您仍然可以使用 Linq to XML,只是减去 linq 语法并使用 Linq Extension 方法。

于 2010-03-14T21:37:24.123 回答