2016-07-14 19 views
0

XMLにC#オブジェクトを逆シリアル化しようとしています。オブジェクトに逆シリアル化

として私のXMLは次のとおりです。

として

私のWCFサービスの契約がある

[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; } 
} 

:私はとデシリアライズしようとしています

[OperationContract] 
[WebInvoke(Method = "POST", UriTemplate = "UploadOrderDocument", 
      RequestFormat = WebMessageFormat.Xml, 
      ResponseFormat = WebMessageFormat.Xml, 
      BodyStyle = WebMessageBodyStyle.Bare)] 
[XmlSerializerFormat] 
OrderId UploadOrderDocument(string hrXML); 

私のクラスのようにある

<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> 

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つの方法があります.1つはチャールズのようなクラスを変更し、もう1つはIXmlSerializableを実装し、独自のシリアル化ロジックを実装します。

IXmlSerializableのもう1つの利点は、途中でXML構造が変更された場合でも、クラスの構造を変更する必要なく、その実装を変更できることです。

+0

どのような例であれ助けてもらえますか – Rahul

+0

コードプロジェクトの記事は素晴らしい記事があります:http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly –

関連する問題