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)时,我尝试创建自己的类。

解决方法

感谢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值。