2012-08-27 43 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,您有时可能会意外跳过/忽略最后一条记录。