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 的结构有点糟糕,因此您必须先用代码修复此问题。对于初学者,您可以通过简单的方式顺序读取/解析内容,以便记录的结构清晰,然后过滤他们:

  • 准备一个listJsonB 对象 - 将其命名为“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.r1or r5 或 r6

这样,您将拥有一个allRecords包含漂亮对象的列表,并且您可以简单地.Where(item => item.t ==0)在其上。

但是,如果要忽略许多此类对象,您可能会注意到它非常“浪费”。然后,您可以调整顺序解析器以即时过滤,从而表现得像这样

  • 准备一个listJsonB 对象 - 将其命名为“allRecords”
  • 准备一个类型的变量JsonB- 将其命名为“lastRecord”
  • 准备一个类型的变量int- 将其命名为“numberOfRs”
  • 准备一个类型的变量bool- 将其命名为“isInteresting”,将其预设为 false
  • 获取<data>标签
  • 循环所有它的直接children,并为每个孩子:
    • 检查孩子的名字
    • 如果是<c>
      • 如果isInteresting是真的
        • 添加lastRecordallRecords列表中
      • 创建新的 JsobB 并将其放入lastRecord
      • 重置numberOfRs为零
      • 添加lastRecordallRecords列表中 重置isInteresting为 false
      • 读取c值并将其放入lastRecord.c
    • 如果是<t>
      • 读取值并将其放入lastRecord.t
      • 如果为零,则将其设置isInteresting为 true
    • 如果是<r>
      • 将 1 添加到numberOfRs
      • 如果numberOfRs是 1、5 或 6:
      • 读取值并将其放入lastRecord.r1or r5 或 r6
  • 如果isInteresting是真的
    • 添加lastRecordallRecords列表中

这样,您最终将得到一个已经过滤的列表,同时所有不感兴趣的项目都将被 GC'ed。请注意,'isinteresting - add to list' 执行了两次:一次是在创建新 JsonB 之前,然后是在所有子项都被读取后的最后一步。如果您忘记了循环后的检查添加 - 您有时可能会意外跳过/忽略最后一条记录。

于 2012-08-27T10:24:04.920 回答