【发布时间】: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