Получить отфильтрованный список <T>из XML - PullRequest
1 голос
/ 01 декабря 2011

Я использую следующий код для получения списка из 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 (сгенерированный из приведенного выше кода) -

<?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>

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Если у вас есть доступ к .net> = 3.5, вам следует рассмотреть возможность использования Linq to Xml

1 голос
/ 01 декабря 2011

Ниже приведен пример запроса LINQ-to-XML, который учитывает фильтр cid paremeter. Если вы введете пустую строку в 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();
...