2016-07-14 150 views
0

我想反序列化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

[反序列化具有多个元素属性的XML文件 - 属性不是反序列化]的可能重复(http://stackoverflow.com/questions/14245846/deserializing-xml-file-with-multiple-element-attributes-attributes-are -not-des) – niksofteng

回答

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一个工作演示。

0

你真正拥有的是这个对象

public class OrderId 
{ 
    [XmlElement] 
    public IEnumberable<int> IdValue { get; set; } 
} 

的ElementName不会对name属性的工作。

0

有这样做,一个是改变你的类像查尔斯提到的2种方式,另一种是实现IXmlSerializable的贯彻自己的序列化逻辑。

IXmlSerializable的另一个优点是,如果您的XML结构在某个方向上发生了某些变化,您可以更改该实现,而不必改变类的结构。

+0

你能帮我解释一下吗 – Rahul

+0

这里有一篇关于代码项目的文章:http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly –