2012-08-27 75 views
0

我解析XML文檔只選擇特定的位置,即是這樣的:解析XML和數組

<?xml version="1.0" encoding="UTF-8" ?> 
.... 
    <maj>true</maj> 
    <data> 
     <c>2</c> 
     <t>0</t> 
     <r>168</r> 
     <r>La rentrée Auchan</r> 
     <r>0</r> 
     <r>2012-08-21 00:00:00</r> 
     <r>2012-08-28 00:00:00</r> 
     <r>56</r> 
     <r>VL</r> 

     <c>2</c> 
     <t>1</t> 
     ... 
    </data> 

我想什麼就有什麼的陣列「R」內,但只有第一位置1的位置5和6,並且僅其中t = 0
我試圖像這樣工作,我有綁定數據列表框:

XDocument XMLtxt = JsonConvert.DeserializeXNode(e.Result); 

listClients.ItemsSource = 
    from c in XMLtxt.Descendants() 
    select new JsonB() 
    { 
     t=c.Element("t").Value.Where(x=>(int) x==0), 
     r1=c.Element("r").Select(.. 
    } 

的jsonB:

public class JsonB 
{ 
    public int c { get; set; } 
    public int t { get; set; } 
    public string r1 { get; set; } 
    public int r5 { get; set; } 
    public string r6 { get; set; } 
    public object[] r { get; set; } 
} 

我真的需要幫助,謝謝

回答

0

的XML是有點病態結構,所以你必須要解決這個問題首先與您的代碼。對於初學者來說,在一個簡單的方法,你可以按順序讀取/解析內容,使得記錄的結構是清楚的,然後篩選它們:

  • 製備JsonB對象的list - 它命名即「allRecords」
  • 製備JsonB類型的變量 - 它命名即' lastRecord'
  • 準備int類型的變量 - 它命名即「numberOfRs」
  • 得到<data>標籤
  • 遍歷其所有直接children,併爲每個孩子:
    • 檢查孩子的名字
    • 如果是<c>
      • 創造新JsobB,放入lastRecord
      • 重置numberOfRs爲零
      • 添加lastRecordallRecords列表
      • 閱讀c值,並把它變成lastRecord.c
    • 如果是<t>
      • 讀出的值,並把它變成lastRecord.t
    • 如果它是<r>
      • 加1 numberOfRs
      • 如果numberOfRs爲1,5或6:
      • 讀出的值,並把它變成lastRecord.r1或R5或R6

這樣,你將有一個清單allRecords漂亮的對象,你可以簡單地.Where(item => item.t ==0)就可以了。

但是,如果許多此類對象被忽略,您可能會注意到它非常「浪費」。然後,你可以調整順序解析器來過濾,然後在即時,因此這樣的表現

  • 準備JsonB對象的list - 它命名即「allRecords」
  • 準備JsonB類型的變量 - 它命名即「lastRecord」
  • 製備int類型的變量 - 它命名即「numberOfRs」
  • 製備bool類型的變量 - 它命名爲即「isInteresting」,它預設爲假
  • 得到<data>標籤
  • 遍歷其所有直接children,併爲每個孩子:
    • 檢查孩子
    • 如果是<c>的名稱:
      • 如果isInteresting是真的
        • 添加lastRecordallRecords列表
      • 創造新JsobB,放入lastRecord
      • 重置numberOfRs爲零
      • 添加 lastRecordallRecords列表 重置isInteresting
      • 閱讀c的值並將其寫入lastRecord.c
    • 如果是<t>
      • 讀出的值,並把它變成lastRecord.t
      • 如果是0,那麼設置isInteresting爲true
    • 如果是<r>
      • 將1加到numberOfRs
      • 如果numberOfRs是1,5或6:
      • 讀出的值和把它放入lastRecord.r1或R5或R6
  • 如果isInteresting爲真
    • 添加lastRecordallRecords列表

這樣,您最終會得到一個已被過濾的列表,同時所有不感興趣的項目都將被GC化。請注意,'正在興趣 - 添加到列表'會執行兩次:創建新的JsonB之前,然後在最後一步讀完所有的孩子之後。如果您在循環後忘記了check-add,您有時可能會意外跳過/忽略最後一條記錄。