【问题标题】:Object element from XML De-serialization not filling Attributes are来自 XML 反序列化的对象元素未填充属性是
【发布时间】:2021-02-19 13:25:10
【问题描述】:

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

【问题讨论】:

  • 你只有属性和类。您缺少内部文本。使用以下内容:[XmlText] 公共字符串值;
  • 我确实尝试过,但没有成功。我仍然没有从 innerText 获得值。在我切换回通过 DOM 解析之前,我仍在尝试完成这项工作。
  • 你有一个数组。这是两种类型的 Xml 数组 1) 一级标签 2) 二级标签。您正在使用:[XmlElement("FLD")] 这意味着 Xml 文件只有一个级别的数组标签。
  • 是的,虽然问题不在于数组,而在于我如何定义 FLD 值。当我把它放在适当的位置时,我能够从 XML 中获取值: public partial class RESULTFLD { [XmlAttribute("NAME")] public string NAME; [XmlAttribute("TYPE")] 公共字符串类型; [System.Xml.Serialization.XmlTextAttribute()] 公共字符串值; }

标签: c# xml class xml-deserialization


【解决方案1】:

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

【讨论】:

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