2014-02-23 19 views
1

假設我將擁有一個xml,並且我想驗證此文件是否使用.net(C#)驗證是否如下所示:僅當給定屬性不存在至少一次或包含給定值時才加載XML

如果沒有以上
  • 如果文件節點中的至少一個沒有過濾器,做一些
  • 如果所有的文件有一個篩選器屬性,這 的至少一個過濾器值相匹配做點什麼
  • 遇到,什麼也不做

我一直在努力掙扎,並且想出了非常複雜的代碼,我相信這可以做得更簡單,就像我嘗試的那樣。

一些例子:接受濾波器值將是「NL」

<!-- some nodes above --> 
<file name="something"/> 
<file name="something else"/> 
<file name="and something else" filter="en, fr, de"/> 
<!-- more nodes below --> 

這通過作爲有至少一個文件,而無需過濾器值

<!-- some nodes above --> 
<file name="something" filter="nl, hu"/> 
<file name="something else" filter="ru"/> 
<file name="and something else" filter="en, fr, de"/> 
<!-- more nodes below --> 

這也將傳遞至少一個文件匹配'nl'限制(第一個文件)

<!-- some nodes above --> 
<file name="something" filter="pt, hu"/> 
<file name="something else" filter="ru"/> 
<file name="and something else" filter="en, fr, de"/> 
<!-- more nodes below --> 

這一個應該失敗,因爲既不o ne的文件缺少filter屬性,並且任何一個篩選器都不包含'nl'

任何關於什麼是最簡單和最有效的方式來實現此目的的建議?

+0

除非你有節點的船載(即成千上萬)來檢查,我簡單地閱讀完整的XML數據使用'XmlSerializer'的大風扇爲內存數據對象模型。然後,您可以使用任何內置的C#代碼/邏輯來過濾數據。除非您遇到特定的性能問題,否則我認爲它是最簡單和最易維護的。 (獎勵:您可以使用此相同的邏輯來驗證您的文件過濾器,如果你有用戶在程序中進行編輯)編輯:Bonus2:它分開你的序列化的擔憂使其易於添加/更改過濾器,或更好的跟蹤/報告或單元測試的問題。 –

回答

0

你有試過linq2xml嗎?

XDocument doc = XDocument.Load(@"data.xml"); 

var restrict = "nl"; 
var anyMissingFilter = (from filter in doc.Descendants("file") 
         where filter.Attribute("filter") == null 
         select 1).Any(); 
var anyRestrictionMatch = (from filter in doc.Descendants("file") 
          where 
           filter.Attribute("filter") != null && 
           filter.Attribute("filter").Value.Contains(restrict) 
          select 1).Any(); 
+0

我沒有真正看過這個。實際上,我刷新我的知識,我被困在時間了幾年,我仍然將我的.NET 1 VB技能,最新的C#,CA有點有時一個挑戰......這看起來很有希望,至少,我承擔我只需要檢查一下,如果anyMissingFilter或anyRestrictionMatch包含我可以安全去的內容? – Wokoman

+0

他們都是bool; Any()方法在/達到第一個匹配條件時簡單地返回true。 – maf748

+0

太好了,我實際上設法把它放在一個塊如下 VAR validNodes =(從文件doc.Descendants( 「文件」) 其中files.Attribute( 「區域設置」)== NULL || files.Attribute(」區域設置「)。Value.Contains(區域設置)選擇1)。任何(); if(validNodes == true){其餘代碼} 的作品就像一個魅力,謝謝! – Wokoman

0

您可以簡單地使用您選擇的方法(XmlReader,Linq to Xml,XmlDocument)傳遞Xml文件。如果您發現文件不包含過濾器或符合條件的過濾器,則會驗證文件。否則它不會。

最有效的方法肯定會使用普通的XmlReader,因爲這樣你不會在內存中保存孔Xml。其他方法在內部也使用XmlReader,但更方便。

相關問題