【问题标题】:Get filtered List<T> from XML从 XML 中获取过滤后的 List<T>
【发布时间】:2011-12-01 23:47:36
【问题描述】:

我正在使用以下代码从 xml 文件中获取列表 -

    public static List<T> GetListFromXml<T>(string filePath)
    {
        using (TextReader reader = new StreamReader(filePath))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<T>));
            return (List<T>) serializer.Deserialize(reader);
        }
    }

但是,我还需要一种过滤记录的方法,我可以通过 -
过滤列表 - 不。从 xml 文件中获取的记录
- 按特定节点值过滤
因此上述方法的签名将更改为 -

    public static List<T> GetListFromXml<T>(string filePath, 
                                            int listCount, 
                                            string filterbyNode, 
                                            string filterByValue);

如果我可以直接从 XML 文件中过滤还是应该从返回的列表中过滤,请指导我?


附言

上面提到的xml文件也是用代码创建的——

    public static void WriteListToXml<T>(List<T> list, string filePath)
    {
        using (TextWriter writer = new StreamWriter(filePath))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<T>));
            serializer.Serialize(writer, list);
        }
    }

为什么我将从数据库返回的自定义集合保存到 xml 文件 - 因为我想一次只处理一批记录。

和 XML 文件 sn-p (从上面的代码生成) -

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfClassifiedLocation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <CLocation>
    <CId>5726</CId>
    <Long>0</Long>
    <Lat>0</Lat>
    <Postcode>ZZ1 5ZZ</Postcode>
    <Street />
    <Town />
  </CLocation>
  <CLocation>
    <CId>5736</CId>
    <Long>0</Long>
    <Lat>0</Lat>
    <Postcode>ZZ1 5ZZ</Postcode>
    <Street />
    <Town />
  </CLocation>
</ArrayOfClassifiedLocation>

【问题讨论】:

  • 你能用 LINQ-TO-XML 代替 XmlSerializer 吗?举一个您的 XML 示例,以便我能够根据您的 XML 结构为您提供一个示例。一个例子 - stackoverflow.com/a/8296317/485076
  • 我已经添加了一个例子,我相信你会很清楚,因为它很简单

标签: c# xml linq-to-xml


【解决方案1】:

如果您可以访问 .net >= 3.5,则应考虑使用Linq to Xml

【讨论】:

    【解决方案2】:

    下面是一个考虑cid 参数过滤器的LINQ-to-XML 查询示例。如果您在cidFilter 中输入空字符串,查询将返回所有条目:

    // you can use Parse() method:
    // XDocument loaded = XDocument.Parse(xmlString);
    XDocument loaded = XDocument.Load("c:\\temp\\testxl.xml");
    
    // return only entry fith CID == 5726
    string cidFilter = "5726";
    var filteredItems =
    loaded.Descendants("CLocation")
        .Select((w, i) =>
                new
                    {
                        Index = i,
                        CID = w.Descendants("CId").FirstOrDefault().Value,
                        PostCode = w.Descendants("Postcode").FirstOrDefault().Value
                    })
        .Where(item => String.IsNullOrEmpty(cidFilter) || item.CID == cidFilter)
        .ToList();
    
    int itemsCount = filteredItems.Count();
    

    【讨论】:

      猜你喜欢
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 2013-08-23
      • 2011-05-07
      相关资源
      最近更新 更多