2017-06-05 2 views
2

私は、XMLシリアル/デシリアライズしたいくつかの汎用クラスを書くために物事とtyringちょっと新しい人です。 XmlSerializer.Deserialize(typeof(T))を使用している間、私はTオブジェクトが私のXMLの親要素の名前と同じ名前でなければならないことを認識しています。ここで私はすなわちFoodPlaces.xmlこの例で使用しているXML文書は次のとおりです。C#:XMLデシリアライズ制限

<foodplaces> 
      <foodplace> 
       <name> The Indian Restaurant</name> 
       <week> 47 </week> 
       <monday> 
        <food> Pasta </food> 
        <food> chineese food</food> 
        <food> veg food </food> 
       </monday> 
       <tuesday> 
        <food> Indian food</food> 
        <food> Veg food </food> 
       </tuesday> 
      </foodplace> 
      <foodplace> 
       <name> Restauran Italian </name> 
       <week> 47 </week> 
       <monday> 
        <food> Pizza </food> 
        <food> Checken  </food> 
        <food> sallad </food> 
       </monday> 
       <tuesday> 
        <food> Fish </food> 
        <food> ris </food> 
        <food> Biff </food> 
        <food> Checken </food> 
       </tuesday> 
      </foodplace> 
     </foodplaces> 

そして、これは私がこのXMLをデシリアライズしていますか、次のとおりです。

var serializer = new XmlSerializer(typeof(foodplaces)); 
var fs = new FileStream(@"D:\FoodPlaces.xml", FileMode.Open); 
var reader = XmlReader.Create(fs); 

var fp = (foodplaces)serializer.Deserialize(reader); 
fs.Close(); 

これは絶対に正常に動作しますので、私のストレージクラス名は、XMLファイルの最上位/親要素である「foodplaces」です。私はMyFoodPlacesに私のストレージ・クラスの名前を変更しようとすると

、これは起こった:

*System.InvalidOperationException was unhandled 
    HResult=-2146233079 
    Message=There is an error in XML document (1, 2). 
    Source=System.Xml 
//Skipping stack trace: 
InnerException: 
     HResult=-2146233079 
     **Message=<foodplaces xmlns=''> was not expected.** 
     Source=Microsoft.GeneratedCode* 

を、私は戻ってXML内の最上位/親要素である「foodplaces」に名前を変更した場合にこの問題は修正されるだろう。

質問:
1.このXMLデータを別の名前のe..g MyfoodPlacesの別のクラスに保存するとどうなりますか?
2. LinQを使用して解決策はありますか?

答えて

2
[XmlRoot("foodplaces")] 
public class ThisCanBeAnything {...} 

あり、属性の範囲は、その影響は、このされているなど[XmlRoot(...)][XmlElement(...)][XmlAttribute(...)][XmlArrayItem(...)][XmlArray(...)][XmlInclude(...)][XmlIgnore(...)]、を含む彼らはまた、完全なXML名前空間のコントロール(だけではなく、デフォルトの名前空間を許可します)。

参照:詳細についてはhttps://msdn.microsoft.com/en-us/library/83y7df3e(v=vs.110).aspxおよびhttps://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.110).aspxをご覧ください。

注:[Serializable]はありません影響xmlシリアル化。あなたがXmlSerializerを使用しているときにそれを含めるよう指示する人は誰も信じてはいけません。

+0

ありがとうございました。私はあなたの返事を持っていることを望んでいた:) –