c# - 来自 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 值。