首页 > 解决方案 > 来自 XML 反序列化的对象元素未填充属性是

问题描述

我从如下所示的 Web 服务 XML 接收回:

<RESULT>
<GRP ID="INP">
    <FLD NAME="SORDNO" TYPE="Char"></FLD>
    <FLD NAME="SITENO" TYPE="Char">999</FLD>
</GRP>
<TAB DIM="100" ID="POS" SIZE="0"/>
<TAB DIM="500" ID="ERR" SIZE="2">
    <LIN NUM="1">
        <FLD NAME="ERRORS" TYPE="Char"/>
    </LIN>
    <LIN NUM="2">
        <FLD NAME="ERRORS" TYPE="Char">Site code 999 is not valid</FLD>
    </LIN>
</TAB>

我想将 XML 编码为一个对象,因此我创建了一个似乎与 XML 结构匹配的类:

namespace DropShipmentFulfillment.SagePOCreateProcess
{
    public class SagePOCreateResponse1
    {
        [XmlRoot("RESULT")]
        public class RESULT
        {
            [XmlElement("GRP")]
            public RESULTGRP GRP;
            [XmlElement("TAB")]
            public RESULTTAB[] TAB;
        }
        public partial class RESULTGRP
        {
            [XmlAttribute("ID")]
            public string ID;
            [XmlElement("FLD")]
            public RESULTFLD[] FLD;
        }
        public partial class RESULTTAB
        {
            [XmlAttribute("DIM")]
            public string DIM;
            [XmlAttribute("ID")]
            public string ID;
            [XmlAttribute("SIZE")]
            public string SIZE;
            [XmlElement("LIN")]
            public RESULTLIN[] LIN;
        }
        public partial class RESULTLIN
        {
            [XmlAttribute("NUM")]
            public string NUM;
            [XmlElement("FLD")]
            public RESULTFLD FLD;
        }
        public partial class RESULTFLD
        {
            [XmlAttribute("NAME")]
            public string NAME;
            [XmlAttribute("TYPE")]
            public string TYPE;
        }
    }
}

当我执行序列化时,我执行以下代码:

private SagePOCreateResponse1.RESULT GetPOResponse(SageWeb.CAdxResultXml sageSvcResponse)
{
    string xml = sageSvcResponse.resultXml;

    XmlSerializer serializer = new XmlSerializer(typeof(SagePOCreateResponse1.RESULT));
    StringReader rdr = new StringReader(xml);
    SagePOCreateResponse1.RESULT resultingMessage = (SagePOCreateResponse1.RESULT)serializer.Deserialize(rdr);
    return resultingMessage;
}

当我执行程序时,我没有收到一个错误,指出类结构与 XML 结构不匹配,但具体来说,FLD 元素不包含值。例如,如果我停下来查看一个特定字段 (FLD),在 GRP 中我会得到属性值,而不是元素的值:

?objectResponse.GRP.FLD[0]
{DropShipmentFulfillment.SagePOCreateProcess.SagePOCreateResponse1.RESULTFLD}
    NAME: "SORDNO"
    TYPE: "Char"

似乎序列化程序没有将元素值放在适当的位置,尽管我认为我已经正确命名它并且我没有收到任何错误。

我错过了什么? 为什么它会解析属性而不是元素值?

我确实尝试过将 XSD 创建到 C# 类路由,但是当我不得不处理动态线 (LIN) 时,我尝试创建自己的类。

标签: c#xmlclassxml-deserialization

解决方案


感谢 jdweng,我找到了解决方案。从我的问题中保持所有相同的东西我改变了一个类:

    public partial class RESULTFLD
    {
        [XmlAttribute("NAME")]
        public string NAME;
        [XmlAttribute("TYPE")]
        public string TYPE;
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value;
    }

我需要这一行“[System.Xml.Serialization.XmlTextAttribute()]”,而不仅仅是“[XmlText]”行。

该类现在对 XML 进行反序列化,因此我同时获得了属性值和 innerText 值。


推荐阅读