首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反序列化此xml元素的技巧

反序列化此xml元素的技巧
EN

Stack Overflow用户
提问于 2017-10-05 09:52:54
回答 1查看 73关注 0票数 0

遗留应用程序以xml元素的形式传输数据。

代码语言:javascript
复制
<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元素直接反序列化为对象,但我对如何做到这一点有一些疑问。元素frame只包含一个应答。我真的需要两门不同的课吗?在returnValue中,可以有零或更多的示例。在我的班级中,正确的类型是List还是Sample[]?在反序列化过程中,这两个选项之间有真正的区别吗?示例中的大多数字段是可选的。我该怎么做这个模型?

当使用XmlSerializer序列化对象时,将自动添加有关xml和根元素上的其他属性的信息,例如:

代码语言:javascript
复制
<?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"> 

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

谢谢菲利波

EN

回答 1

Stack Overflow用户

发布于 2017-10-05 12:59:29

如果xml包含名称空间(如示例中所示),则可以使用以下类:

代码语言:javascript
复制
[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; }
}

如果您只对节点应答感兴趣,这是唯一的。只能反序列化此节点:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46582706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档