我正在尝试将XML反序列化为C#对象。
我的XML如下:
<StaffingOrder xmlns='StaffinfOrderNamespace' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<OrderId idOwner="VMSAccess">
<IdValue name='RequisitionID'>1</IdValue>
<IdValue name='KellyBranch'>3319</IdValue>
</OrderId>
</StaffingOrder>
我的班级如下:
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[XmlRoot("StaffingOrder")]
public class OrderId
{
[XmlElement(ElementName = "RequisitionID")]
public int RequisitionID { get; set; }
[XmlElement(ElementName = "KellyBranch")]
public int KellyBranch { get; set; }
}
我的WCF服务合同如下:
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "UploadOrderDocument",
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Bare)]
[XmlSerializerFormat]
OrderId UploadOrderDocument(string hrXML);
我正在尝试将反序列化为:
public OrderId UploadOrderDocument(string hrXMLString)
{
OrderId orderId = new OrderId();
using (StringReader sr = new StringReader(hrXMLString))
{
XmlSerializer xs = new XmlSerializer(typeof(OrderId));
orderId = (OrderId)xs.Deserialize(sr);
var temp = orderId.RequisitionID;
}
return orderId;
}
我在反序列化时没有收到任何错误,但没有获得RequisitionID
的任何值。
答案 0 :(得分:3)
您的课程似乎与您尝试反序列化的XML几乎没有相似之处。如果您要从您创建的类中创建XML,它将看起来像这样:
<StaffingOrder>
<RequisitionID>1</RequisitionID>
<KellyBranch>3319</KellyBranch>
</StaffingOrder>
您想要的是实际代表XML结构的类:
[XmlRoot(Namespace = "StaffinfOrderNamespace")]
public class StaffingOrder
{
public OrderId OrderId { get; set; }
}
public class OrderId
{
[XmlAttribute("idOwner")]
public string IdOwner { get; set; }
[XmlElement("IdValue")]
public List<IdValue> IdValues { get; set; }
}
public class IdValue
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlText]
public int Value { get; set; }
}
有关正常工作的演示,请参阅this fiddle。
答案 1 :(得分:0)
你实际拥有的是这个对象
public class OrderId
{
[XmlElement]
public IEnumberable<int> IdValue { get; set; }
}
ElementName不会对name属性起作用。
答案 2 :(得分:0)
有两种方法可以做到这一点,一种是像Charles提到的那样改变你的类,另一种是实现IXmlSerializable并实现你自己的序列化逻辑。
IXmlSerializable的另一个优点是,如果您的XML结构在此过程中某处发生更改,则可以更改该实现,而无需更改类的结构。