2010-03-14 27 views
1

我有一個代碼庫,它大量使用XPathNavigator來解析某些特定的xml文檔。 XML文檔交叉引用,這意味着一個元素可以解析過程中引用另外一個還沒有遇到:Silverlight中的XPathNavigator

<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)如果我必須在代碼中進行修改,那麼最好的方法是什麼?理想情況下,我想對進行最小更改,而不是重寫代碼的80%,以便能夠使用XLinq之類的東西。

要恢復,萬一我不得不放棄XPathNavigator,我只需要一種方法來在我的文檔中爲地點添加書籤,並返回給他們,以便我可以繼續從我離開的地方迭代。

在此先感謝您的任何幫助/想法。

+0

你不能擁有一切。微軟在SilverLight框架中保留了多少種解析XML的方法? – 2010-03-14 19:01:41

+0

IIRC,.NET框架附帶兩個XPathNavigator實現,一個在標準的W3C DOM實現(XmlNode)上運行,另一個在XPathDocument上運行。 XPathDocument在Silverlight中可用,所以我不太確定爲什麼XPathNavigator不在那裏..? – vladimir 2010-03-14 19:09:08

+0

錯誤,XPathDocument也不存在。我想我必須顯着修改代碼。 – vladimir 2010-03-14 20:00:24

回答

1

您不會錯過某些明顯的東西,在Silverlight版本的庫中沒有實現XPathNavigator或XPathDocument。

「最佳路線」非常主觀,取決於XPathNavigator,取決於多少行代碼。不過,我看到了一些選擇。

  • 繼續並使用System.Xml.Linq namepsace中的XDocument,XElement等重新編寫代碼。這可能不像你想象的那樣糟糕。
  • 將Xml-to-Linq對象包裝在自己的實現中,您實際使用的XPathNavigator的屬性和方法。對於Xml-to-Linq對象,重新創建XPathNavigator的大部分功能並不難。然後,您可以根據自己的XPathNavigator運行現有的代碼。
+0

謝謝安東尼,這兩個建議都很完美。 我目前傾向於使用XDocument/XElement,但主要是因爲我不熟悉XLinq。在任何情況下,似乎我將不得不放棄使用我的XSD架構的文檔驗證,除非我設法將它(正確地!)轉換爲一個dtd。 – vladimir 2010-03-14 21:45:22

+0

@Vladimir:我個人發現很難將XDocument/XElement從「XLinq」中分離出來,因爲描述這個特性的擴展方法和'XDocument'在同一個命名空間。 – AnthonyWJones 2010-03-14 21:58:49

+0

是真的,我使用的分離是不存在的。 – vladimir 2010-03-14 23:11:45

0

有噸的方法: How to deal with XML in C#

,您仍然可以使用LINQ到XML只是減去LINQ語法和使用LINQ的擴展方法。

+0

@nyxtom:__Silverlight__中沒有「噸方式」來處理XML。實際上只有2個'XmlReader'或'XDocument'。 – AnthonyWJones 2010-03-14 21:40:34

+0

這裏的扭曲是Silverlight中的可用性,它顯着減少了選擇的數量。儘管XLinq肯定是其中之一。 – vladimir 2010-03-14 21:51:05

1

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

相關問題