【问题标题】:XPathNavigator in SilverlightSilverlight 中的 XPathNavigator
【发布时间】:2010-03-14 18:59:19
【问题描述】:

我有一个代码库,它大量使用 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) 如果我必须对代码进行修改,最好的方法是什么?理想情况下,我希望进行最小 的更改,而不是为了能够使用 Xlinq 之类的东西而重写 80% 的代码。

若要继续,万一我不得不放弃 XPathNavigator,我只需要一种方法来为我的文档中的位置添加书签并返回到它们,以便我可以从中断的地方继续迭代。

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

【问题讨论】:

  • 你不可能拥有一切。微软应该在 SilverLight 框架中保留多少种不同的 XML 解析方式?
  • IIRC,.NET 框架附带了两个 XPathNavigator 实现,一个在标准 W3C DOM 实现 (XmlNode) 上运行,另一个在 XPathDocument 上运行。 XPathDocument 在 Silverlight 中可用,所以我不太清楚为什么 XPathNavigator 也不在那里..?
  • 错了,XPathDocument 也不存在。我想我必须对代码进行重大修改。

标签: silverlight xpathnavigator


【解决方案1】:

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

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

  • 继续使用 System.Xml.Linq 命名空间中的 XDocument、XElement 等重新编写代码。这可能没有您想象的那么糟糕。
  • 将 Xml-to-Linq 对象包装在您实际使用的 XPathNavigator 的那些属性和方法的实现中。针对 Xml-to-Linq 对象重新创建 XPathNavigator 的大部分功能应该不会太难。然后,您可以针对自己的 XPathNavigator 运行现有代码。

【讨论】:

  • 感谢 Anthony,这两个建议都是合理的。我目前倾向于使用 XDocument/XElement,但这主要是因为我不熟悉 Xlinq。在任何情况下,我似乎都必须放弃使用我的 XSD 模式进行文档验证,除非我设法将它(正确!)转换为 dtd。
  • @Vladimir:我个人觉得很难将 XDocument/XElement 与“XLinq”分开,因为描述此功能的扩展方法与 XDocument 位于同一名称空间中。
  • 是的,我使用的分离不存在。
【解决方案2】:

XPath (xdoc.XPathSelectElements) 在 Silverlight 4 中可用:here's an online 测试工具。

【讨论】:

    【解决方案3】:

    有很多方法: How to deal with XML in C#

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

    【讨论】:

    • @nyxtom:在 Silverlight 中处理 XML 的方式并不多。实际上只有2个XmlReaderXDocument
    • 这里的转折是 Silverlight 中的可用性,它显着减少了选择的数量。 Xlinq 肯定仍然是其中之一。
    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多