问题描述
我从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值。