2012-03-28 11 views
0

in.net C#でオブジェクトにXMLファイルからデシリアライズすることができません:私はWCFでデータコントラクトクラスを以下している3.0 WCFサービス

[DataContract] 
public class PropertyDetails 
{ 
    # region >>---> private members 

     string city;   
     string propertyType;  
     double price;   
     string propertyClass; 

    # endregion 

    #region >>---> public properties 
     [DataMember] 
     public string City 
     { 
      get { return city; } 
      set { city = value; } 
     } 

     [DataMember] 
     public string PropertyType 
     { 
      get { return propertyType; } 
      set { propertyType = value; } 
     } 

     [DataMember] 
     public double Price 
     { 
      get { return price; } 
      set { price = value; } 
     } 

     [DataMember] 
     public string PropertyClass 
     { 
      get { return propertyClass; } 
      set { propertyClass = value; } 
     } 
    #endregion 
} 

}

私はを次のコードを使用してXMLファイルにノードを作成します。

public void insertPropertyRecord(string city, string propertyType, double price, string propertyClass) 
    { 
     XmlTextReader propertyRecordReader = new XmlTextReader(WebConfigurationManager.AppSettings["XMLPropertyRecords"]); 
     XmlDocument xmlDocPropertyRecords = new XmlDocument(); 
     xmlDocPropertyRecords.Load(propertyRecordReader); 
     propertyRecordReader.Close(); 

     XmlElement xmlPropertyRecordRootNode = xmlDocPropertyRecords.DocumentElement; 
     if (!xmlPropertyRecordRootNode.HasChildNodes) 
     { 
      XmlElement xmlPropertyRecordNode = xmlDocPropertyRecords.CreateElement("propertyrecord"); 
      XmlElement xmlPropertyRecordChildNode = null; 

       xmlPropertyRecordChildNode = xmlDocPropertyRecords.CreateElement("city"); 
       xmlPropertyRecordChildNode.InnerText = city; 
       xmlPropertyRecordNode.AppendChild(xmlPropertyRecordChildNode); 

       xmlPropertyRecordChildNode = xmlDocPropertyRecords.CreateElement("propertytype"); 
       xmlPropertyRecordChildNode.InnerText = propertyType; 
       xmlPropertyRecordNode.AppendChild(xmlPropertyRecordChildNode); 

       xmlPropertyRecordChildNode = xmlDocPropertyRecords.CreateElement("price"); 
       xmlPropertyRecordChildNode.InnerText = Convert.ToString(price); 
       xmlPropertyRecordNode.AppendChild(xmlPropertyRecordChildNode); 

       xmlPropertyRecordChildNode = xmlDocPropertyRecords.CreateElement("propertyclass"); 
       xmlPropertyRecordChildNode.InnerText = propertyClass; 
       xmlPropertyRecordNode.AppendChild(xmlPropertyRecordChildNode); 

      xmlPropertyRecordRootNode.AppendChild(xmlPropertyRecordNode); 
     } 
     else 
     { 
      XmlElement xmlPropertyRecordLastNode = (XmlElement)xmlPropertyRecordRootNode.LastChild; 
      XmlElement xmlPropertyRecordChildNode = null; 
       XmlElement xmlPropertyRecordNode = xmlDocPropertyRecords.CreateElement("propertyrecord"); 

        xmlPropertyRecordChildNode = xmlDocPropertyRecords.CreateElement("city"); 
        xmlPropertyRecordChildNode.InnerText = city; 
        xmlPropertyRecordChildNode.AppendChild(xmlPropertyRecordChildNode); 

        xmlPropertyRecordChildNode = xmlDocPropertyRecords.CreateElement("propertytype"); 
        xmlPropertyRecordChildNode.InnerText = propertyType; 
        xmlPropertyRecordChildNode.AppendChild(xmlPropertyRecordChildNode); 

        xmlPropertyRecordChildNode = xmlDocPropertyRecords.CreateElement("price"); 
        xmlPropertyRecordChildNode.InnerText = Convert.ToString(price); 
        xmlPropertyRecordChildNode.AppendChild(xmlPropertyRecordChildNode); 

        xmlPropertyRecordChildNode = xmlDocPropertyRecords.CreateElement("propertyclass"); 
        xmlPropertyRecordChildNode.InnerText = propertyClass; 
        xmlPropertyRecordChildNode.AppendChild(xmlPropertyRecordChildNode); 

      xmlPropertyRecordLastNode.AppendChild(xmlPropertyRecordNode); 
     } 
     xmlDocPropertyRecords.Save(WebConfigurationManager.AppSettings["XmlPropertyRecords"]); 
    } 

私は次のコードを使用して直列化復元を使用してオブジェクト内のノードを取得しようとしています:

XmlSerializer ser = new XmlSerializer(typeof(List<PropertyDetails>)); 
     TextReader sr = new StreamReader(WebConfigurationManager.AppSettings["XMLPropertyRecords"]); 
     List<PropertyDetails> obj = new List<PropertyDetails>(); 
     obj = (List<PropertyDetails>)ser.Deserialize(sr); 

しかし、私は、無効演算例外として逆シリアル化ラインでのエラーを取得しています 作成されたXML FIEがあります次のとおりです。

<?xml version="1.0" encoding="utf-8"?> 
<propertydetails> 
    <propertyrecord> 
    <City>delhi</City> 
    <PropertyType>residential</PropertyType> 
    <Price>4500000</Price> 
    <PropertyClass>flat</PropertyClass> 
    </propertyrecord> 
</propertydetails> 

お手数ですが、

答えて

0

XMLがうまくいかないようです。下記のようにXMLを使用してみてください。

<ArrayOfPropertydetails> 
    <Propertydetails> 
    <City>delhi</City> 
    <PropertyType>residential</PropertyType> 
    <Price>4500000</Price> 
    <PropertyClass>flat</PropertyClass> 
    </Propertydetails> 
</ArrayOfPropertydetails> 
+0

Thanx shaileshは機能しましたが、その理由を説明できると本当に感謝しています。どのように良い形になっていませんでしたか?私たちが望むようにXMLを記述することができ、タグが作成され閉鎖されたので、なぜプロパティの詳細をarrayofpropertydetailsに変更するのでしょうか? –

+0

List をシリアル化しようとしているようです。この場合、XMLはで始まる必要があります。 – Shailesh

0

整形」XMLドキュメントがある正しいXML構文

構文規則は、前の章で説明しました:。XML要素は終了タグを持っている必要があります。•XMLドキュメント• は、ルート要素 を持っている必要があります •XMLタグは大文字と小文字が区別 •XML要素がなければなりませんされている適切にXML• 入れ子にすることは値が トーベ ヤニ リマインダーを引用符で囲む必要があります属性今週の私を忘れないで!