用于反序列化此xml元素的技巧

时间:2017-10-05 09:52:54

标签: c# xml deserialization

遗留应用程序将数据作为xml元素传输。

<frame>
<reply>
    <id>value_id</id>
    <resultCode>value</resultCode>
    <readSampleIDs>
        <returnValue>
            <Sample>
                <SampleID> value_SampleID </SampleID>
                <SamplePC> value_SamplePC </SamplePC>
                <antennaName> value_antennaName </antennaName>
                <channel> value_channel </channel>
                <power> value_power </power>
                <polarization> value_polarization </polarization>
                <inventoried> value_inventoried </inventoried>
            </Sample>
            …
            <Sample>
            …
            </Sample>
        </returnValue>
    </readSampleIDs>
</reply>

目前提取的信息是逐字解析字符串的。 我认为可以使用 XmlSerializer 直接将xml元素反序列化为对象,但我对如何执行它有一些疑问。 元素框架仅包含一个回复。我真的需要两个不同的课程吗? 在 returnValue 内,可以有零个或多个 Sample 。在我的班级中,正确的类型是什么,列表&lt; Sample&gt; Sample [] ?反序列化期间两个选项之间是否存在真正的差异? 示例中的大多数字段都是可选的。我该如何建模?

使用 XmlSerializer 序列化对象时,会自动添加有关xml版本的信息以及根元素上的其他属性,例如:

<?xml version="1.0" encoding="utf-8"?>  
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.cpandl.com"> 

它们不在我的示例代码中,所以我担心反序列化可能会抱怨它并且可能会失败。

由于 菲利普

1 个答案:

答案 0 :(得分:0)

如果你的xml包含一个命名空间(就像你的例子中那样),那么你可以使用这些类:

[XmlRoot(ElementName = "Sample")]
public class Sample
{
    [XmlElement(ElementName = "SampleID")]
    public string SampleID { get; set; }

    [XmlElement(ElementName = "SamplePC")]
    public string SamplePC { get; set; }

    [XmlElement(ElementName = "antennaName")]
    public string AntennaName { get; set; }

    [XmlElement(ElementName = "channel")]
    public string Channel { get; set; }

    [XmlElement(ElementName = "power")]
    public string Power { get; set; }

    [XmlElement(ElementName = "polarization")]
    public string Polarization { get; set; }

    [XmlElement(ElementName = "inventoried")]
    public string Inventoried { get; set; }
}


[XmlRoot(ElementName = "readSampleIDs")]
public class ReadSampleIDs
{
    [XmlArray(ElementName = "returnValue")]
    [XmlArrayItem(ElementName = "Sample")]
    public List<Sample> Sample { get; set; }
}

[XmlRoot(ElementName = "reply", Namespace = "http://www.cpandl.com")]
public class Reply
{
    [XmlElement(ElementName = "id")]
    public string Id { get; set; }

    [XmlElement(ElementName = "resultCode")]
    public string ResultCode { get; set; }

    [XmlElement(ElementName = "readSampleIDs")]
    public ReadSampleIDs ReadSampleIDs { get; set; }
}

如果您只对节点回复感兴趣,那么这是唯一的一个。您只能反序列化此节点:

XNamespace loNameSpace = "http://www.cpandl.com";
XDocument loDoc = XDocument.Parse(Properties.Settings.Default.TransmitsData);

var loReplyElement = loDoc.Element(loNameSpace.GetName("PurchaseOrder"))
    .Element(loNameSpace.GetName("frame"))
    .Element(loNameSpace.GetName("reply"));

using (var loReader = loReplyElement.CreateReader())
{
    var loSerializer = new XmlSerializer(typeof(Reply));
    var loReply = (Reply)loSerializer.Deserialize(loReader);
    Console.WriteLine(loReply.Id);
}