C # XmlSerializer условно сериализует список <T>элементов - PullRequest
0 голосов
/ 18 января 2019

Мне нужно сериализовать и десериализовать XML с помощью C # XmlSerializer (или есть что-то лучше?).

[XmlElement]
public virtual List<Map> Maps { get; set; }

public class Map
{
    [XmlAttribute("item")]
    public string Item { get; set; }

    [XmlAttribute("uri")]
    public string Uri { get; set; }
}

Maps = new List<Map>{
    new Map { Item="", Uri="" },
    new Map { Item="something", Uri="foo" },
    new Map { Item="", Uri="foo" },
}

Сериализатор должен выбрасывать каждый элемент со строкой. IsNullOrEmpty (map.Item), чтобы результирующий Xml содержал карту только с «чем-то». Как я могу достичь этого без больших хлопот?

<Maps> <Map item="something" uri="foo" /> </Maps>

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Насколько я понял, вы хотите отфильтровать ваш XML перед сериализацией.

Я предлагаю вам использовать LINQ для этого:

var filteredMaps = Maps.Where(map => !string.IsNullOrWhiteSpace(map.Item)).ToList();

Обратите внимание на вызов .ToList() в конце строки. Это важно, так как ваш XmlSerializer имеет тип List<Map> Полагаю. Поместите эту строку перед сериализацией объекта, и результат должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Map item="something" uri="foo" />
</ArrayOfMap>

Не забудьте using System.Linq;

0 голосов
/ 18 января 2019

Итак, вы можете попробовать создать XmlWriter, который отфильтровывает все элементы с атрибутом xsi: nil или содержит пустую строку и передает все остальные вызовы базовому стандартному XmlWriter для «очистки» сериализованного XML.

...