2011-06-24 84 views
2

我從XML格式的兩種不同的Web服務獲得響應。兩種Web服務都具有相同的邏輯,但是採用不同的技術開發。我們正在將我們的網絡服務轉移到微軟技術。 Web服務引擎是連接到許多其他應用程序並向它們提供不同服務的核心。C#:如何在保存前對XML進行排序和縮進?

每當有生產Web服務調用時,我們都會將相似的調用傳遞給在Microsoft Technologies上開發的Web服務,並將兩個響應保存在單獨的文件夾中。

現在,我們必須比較兩個響應(XML)。有很多排序和意向問題。我想避免所有排序和縮進問題,以便我可以得到正確的比較報告。

有沒有辦法可以排序和縮進 XML在保存之前(XMLDocument.Save)呢?

謝謝。


解決方案:

我已經發現了一些XSLT,做的是在網絡上,但似乎是一個 問題,當元素有屬性。

<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-template select="@* | node()"> 
      <xsl:sort select="name()"/> 
     </xsl:apply-template> 
    </xsl:copy> 
</xsl:template> 

事實上,屬性節點必須在任何其他類型的節點之前被複制到結果樹中。由於排序,節點集丟失了文檔順序,因此不能再保證屬性比元素和文本節點更早處理。

一種解決方案是這樣的:

<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"> 
      <xsl:sort select="name()"/> 
     </xsl:apply-templates> 
     <xsl:apply-templates select="node()"> 
      <xsl:sort select="name()"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

但由於結果樹的序列化後屬性的相對輸出順序取決於處理器,你可能也忽略屬性排序:

<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates select="node()"> 
      <xsl:sort select="name()"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

感謝史努比和其他人的幫助!

+0

你是如何保存XML數據現在?發佈一些代碼。 – dtb

+0

@dtb通過XmlDocument.Save() –

回答

3

我推薦xmlunit比較文件,這個nunit擴展名是用c#編寫的並且是免費的。 http://xmlunit.sourceforge.net/

或不喜歡這樣,如果你喜歡手動進行比較:

 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml("bla"); 
XmlTextWriter writer = new XmlTextWriter("data.xml",null); 
writer.Formatting = Formatting.Indented; 
doc.Save(writer); 
+0

@ Snoppy謝謝。這涵蓋了一半的查詢。任何想法如何排序節點而不知道XML? –

+0

System.Collections.Generic.SortedDictionary list = new SortedDictionary (); XmlNode節點; list.Add(「your_sort_key」,node); foreach(var list中的當前值) { //使用XML Writer } – NickD

0

如果使用文本差異工具進行比較,則需要修復縮進。但是,如果您使用XML比較工具進行比較,或者您編寫了迭代節點並進行比較的工具,則縮進變得沒有意義。

看看XML比較工具,比如一個來自Altova的位置:http://www.altova.com/downloadtrialdiffdog.html?gclid=CM-c8ayEzqkCFcNP4Qod4DTKMw

+0

對於比較XML,我對Beyond Compare 3 Pro(format:= XML Sorted and Tided)非常滿意。它只是我想處理的排序和縮進的額外差異。 –

0

如果這是你想要什麼差別,你對內容是自我唯一關心的,例如,檢查是否標頭是正確的設置,如果你缺少任何節點...

我強烈建議停止看到差異手動

我會創建一個簡單的應用程序(窗口/網絡),將讀取這些2個文件夾和消費的每個文件名(讓我們像它的名稱相同),使每個節點和屬性的圖形表示,並且,Assert確保一切都在正確的位置。

在這個目錄中很容易做到和you can programmatically check upon new files,並自動處理它們,例如生成輸出到result目錄,甚至數據庫或電子郵件。

  • 打開文件(使用FileSystemWatcher避免做東西手動地)
  • 解析它們(解析它們成的自定義對象加載它們作爲純XMLNodeList
  • 比較他們(對於每個節點在原始(舊服務)文件中,新服務文件是否有這個?)
+0

我爲什麼要創建一個?我使用Beyond Compare,它對於這種目的非常有用。 –

0

我的建議將通過相同的Xslt(執行排序和縮進)來運行兩個XmlDocuments。生成的XmlDocuments應該很容易與您選擇的工具進行比較(手動)。