0

私は次のような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; }
 } 

私は本当に助けが必要です、ありがとう

4

1 に答える 1

0

XMLは少し構造化されていないため、最初にコードで修正する必要があります。まず、簡単な方法で、レコードの構造が明確になるようにコンテンツを順番に読み取り/解析してから、フィルター処理することができます。彼ら:

  • JsonBオブジェクトを準備しlistます-名前を付けます、つまり「allRecords」
  • タイプの変数を準備しますJsonB-名前を付けますすなわち'lastRecord'
  • タイプの変数を準備しますint-名前を付けますすなわち'numberOfRs'
  • <data>タグを取得する
  • その直接のすべてをループし、children各子について:
    • 子供の名前を確認してください
    • もしそうなら<c>
      • 新しいJsobBを作成し、lastRecord
      • numberOfRsゼロにリセット
      • リストに追加lastRecordするallRecords
      • 値を読み取り、cに入れますlastRecord.c
    • もしそうなら<t>
      • 値を読み取り、に入れますlastRecord.t
    • もしそうなら<r>
      • に1を追加しますnumberOfRs
      • 1、5 numberOfRs、または6の場合:
      • 値を読み取り、それをlastRecord.r1またはr5またはr6に入れます

このようにして、allRecordsきれいなオブジェクトのリストが作成され、簡単.Where(item => item.t ==0)にリストに追加できます。

ただし、そのようなオブジェクトの多くを無視する場合は、非常に「無駄」であることに気付くかもしれません。次に、シーケンシャルパーサーを調整して、オンザフライでフィルター処理し、次のように動作させることができます。

  • JsonBオブジェクトを準備しlistます-名前を付けます、つまり「allRecords」
  • タイプの変数を準備しますJsonB-名前を付けますすなわち'lastRecord'
  • タイプの変数を準備しますint-名前を付けますすなわち'numberOfRs'
  • タイプの変数を準備しますbool-名前を付けますすなわち'isInteresting'、falseにプリセットします
  • <data>タグを取得する
  • その直接のすべてをループし、children各子について:
    • 子供の名前を確認してください
    • もしそうなら<c>
      • isInteresting本当なら
        • リストに追加lastRecordするallRecords
      • 新しいJsobBを作成し、lastRecord
      • numberOfRsゼロにリセット
      • リストに追加し、lastRecordfalseallRecords リセットしますisInteresting
      • 値を読み取り、cに入れますlastRecord.c
    • もしそうなら<t>
      • 値を読み取り、に入れますlastRecord.t
      • ゼロの場合は、isInterestingをtrueに設定します
    • もしそうなら<r>
      • に1を追加しますnumberOfRs
      • 1、5 numberOfRs、または6の場合:
      • 値を読み取り、それをlastRecord.r1またはr5またはr6に入れます
  • isInteresting本当なら
    • リストに追加lastRecordするallRecords

このようにすると、すでにフィルタリングされたリストが作成され、その間にすべての興味のないアイテムがGCされます。'isinteresting --add to list'は2回実行されることに注意してください。1回は新しいJsonBを作成する前で、もう1回はすべての子が読み取られた最後のステップです。チェックを忘れた場合-ループの後に追加-最後のレコードを誤ってスキップ/無視することがあります。

于 2012-08-27T10:24:04.920 に答える