【问题标题】:Tricks for deserialize this xml element反序列化此 xml 元素的技巧
【发布时间】:2017-10-05 09:52:54
【问题描述】:

旧版应用程序将数据作为 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>

目前信息是逐字解析字符串提取的。 我认为 xml 元素可以直接使用 XmlSerializer 反序列化为对象,但我对如何做到这一点有些疑问。 frame 元素只包含一个回复。我真的需要两个不同的课程吗? 在 returnValue 内可以有零个或多个 Sample。在我的班级中,正确的类型是 List 还是 Sample[] ?反序列化期间这两个选项之间是否有真正的区别? 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"> 

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

谢谢 菲利波

【问题讨论】:

标签: c# xml deserialization


【解决方案1】:

如果您的 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多