Как обработать десериализацию .NET XML, где поток XML имеет необязательный элемент - PullRequest
0 голосов
/ 11 октября 2018

Я работаю с поддержкой .NET Serialization.Мне нужно использовать API геокодирования Google для получения результатов запроса геокодирования в виде XML и десериализации XML в класс C #.Проблема в том, что класс C # имеет свойство, которое соответствует элементу XML, который может присутствовать или не присутствовать в потоке XML.

Я просмотрел документацию MSDN для сериализации / десериализации XML, чтобы найти способчтобы справиться с этим, но ничего не выскакивает.Есть ли способ указать, что элемент является необязательным в потоке XML?

Вот класс C #, содержащий десериализованный XML:

[XmlRoot]
public class MyGeocodeResponse
{
    [XmlElement("status")]
    public string Status { get; set; }

    [XmlElement("result")]
    public Result[] Results { get; set; }

    [XmlElement("partial_match")]
    public bool PartialMatch { get; set; }
}

Элемент "partal_match "выглядит так:необязательный.Когда я десериализирую какой-то XML, в котором нет элемента "component_match", возникает исключение (InvalidOperationException).

Есть ли способ указать, что элемент "partal_match "может отсутствовать?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Если элемент может присутствовать, но он может иметь значение Null, используйте это:

[XmlElement("partial_match", IsNullable = true)]

Если элемент может вообще отсутствовать, то сделайте следующее:

private bool? partialMatch;
[XmlElement("partial_match")]
public bool PartialMatch 
{ 
    get { return this.partialMatch; }

    set { this.partialMatch = value; this.PartialMatchSpecified = true; } 
}

[XmlIgnore] 
public bool PartialMatchSpecified { get; set; }
0 голосов
/ 12 октября 2018

Вы пытались использовать вместо них DataContract и [DataMember (IsRequired = false)?

[DataContract(Namespace ="youNamespace")]
public class MyGeocodeResponse
{
[DataMember(Name="status")]
public string Status { get; set; }

[DataMember(Name="result")]
public Result[] Results { get; set; }

[DataMember(Name="partial_match", IsRequired = false)]
public bool PartialMatch { get; set; }
}
...