2008-09-16 8 views
0

XMLにシリアライズするために使用される一連のクラスについて作業しています。 XMLは私によって制御されず、むしろ整理されています。残念ながら、いくつかのネストされたノードのセットがありますが、そのうちのいくつかの目的は、単にその子のコレクションを保持することだけです。 XML Serializationに関する私の現在の知識に基づいて、それらのノードは別のクラスを必要とします。.NET XML Seralization

クラスを1つではなくXMLノードのセットにシリアル化する方法はありますか。

<root> 
    <users> 
     <user id=""> 
      <firstname /> 
      <lastname /> 
      ... 
     </user> 
     <user id=""> 
      <firstname /> 
      <lastname /> 
      ... 
     </user> 
    </users> 
    <groups> 
     <group id="" groupname=""> 
      <userid /> 
      <userid /> 
     </group> 
     <group id="" groupname=""> 
      <userid /> 
      <userid /> 
     </group> 
    </groups> 
</root> 

理想的には、3つのクラスは最高のようになります。私は泥のように明確にされてるように感じるので、私たちはXMLを持っていると言います。クラスrootは、コレクションがusergroupのオブジェクトです。しかし、私は理解することができる最高のは、私がusersgroupsはそれぞれusergroupのコレクションのみを含んでrootusersusergroupsgroup、のクラスを必要とすることで、rootusers、およびgroupsオブジェクトが含まれています。

誰かが私よりよく知っている? (嘘をつけない、私はそこにいると知っている)。

答えて

6

を使用していませんか?それはかなり気が悪く、このようなことを簡単にやってくれます(私はそれをかなり使っています)。

あなたは、単にいくつかの属性を使用して、クラスのプロパティを飾ることができ、残りはすべてが

は、あなたがのXmlSerializerを使用して考えがありますか特定の理由がなぜそこにある..あなたのために行われていますか?相続人

上記は、(両方の方法)をシリアル化するために取得するために必要なすべての作業のコードスニペット:

[XmlArray("users"), 
XmlArrayItem("user")] 
public List<User> Users 
{ 
    get { return _users; } 
} 
+0

私はXMLSerializerを使用していますが、クラスやプロパティには1つの要素名しか適用できません。私はいくつかの仲介クラスを持っています。彼らはすべて、他のオブジェクトのコレクションを保持しています。結果は適切なXMLですが、自分自身をインスタンス化するためのバットの痛みです。 –

+0

デモへのコードを追加しました。 –

+0

@Rob Cooper:コードパンチで私を打つため+1。 – user7116

0

あなたが唯一のユーザーオブジェクトの配列として定義されたユーザーを持っている必要があります。 XmlSerializerはそれを適切にレンダリングします。私はhttp://quickstart.developerfusion.co.uk/quickstart/howto/doc/xmlserialization/XSDToCls.aspx

ごとに、XSDを生成するために、Visual Studioを使用し、あなたのためのクラス階層を吐き出すためにコマンドラインユーティリティXsd.exeではを使用することをお勧めします、さらに http://www.informit.com/articles/article.aspx?p=23105&seqNum=4

例えば、このリンクを参照してください。

0

私はあなたがやろうとしているものに似ていると思うことを行うためにこのクラスを遡って書きました。 XMLにシリアライズするオブジェクトに対して、このクラスのメソッドを使用します。たとえば、従業員が与えられた場合...

ユーティリティを使用すると、 using System.Xml。シリアライゼーション。

[XMLRootは( "従業員")] パブリッククラスEmployee {プライベート文字列名= "スティーブ"。

<Employee> 
    <Name>Steve</Name> 
</Employee> 

オブジェクトタイプ(従業員)がシリアライズ可能である必要があります:このコードは出力べき

[XmlElement("Name")] 
public string Name { get { return name; } set{ name = value; } } 

public static void Main(String[] args) 
{ 
     Employee e = new Employee(); 
     XmlObjectSerializer.Save("c:\steve.xml", e); 
} 

}

。 [Serializable(true)]を試してください。 私はこのコードのより良いバージョンをどこかに持っています。私はそれを書いたときに学んでいました。 とにかく、以下のコードをチェックしてください。私はいくつかのプロジェクトでそれを使用しているので、間違いなく動作します。

using System; 
using System.IO; 
using System.Xml.Serialization; 

namespace Utilities 
{ 
    /// <summary> 
    /// Opens and Saves objects to Xml 
    /// </summary> 
    /// <projectIndependent>True</projectIndependent> 
    public static class XmlObjectSerializer 
    { 
     /// <summary> 
     /// Serializes and saves data contained in obj to an XML file located at filePath <para></para>   
     /// </summary> 
     /// <param name="filePath">The file path to save to</param> 
     /// <param name="obj">The object to save</param> 
     /// <exception cref="System.IO.IOException">Thrown if an error occurs while saving the object. See inner exception for details</exception> 
     public static void Save(String filePath, Object obj) 
     { 
      // allows access to the file 
      StreamWriter oWriter = null; 

      try 
      { 
       // Open a stream to the file path 
       oWriter = new StreamWriter(filePath); 

       // Create a serializer for the object's type 
       XmlSerializer oSerializer = new XmlSerializer(obj.GetType()); 

       // Serialize the object and write to the file 
       oSerializer.Serialize(oWriter.BaseStream, obj); 
      } 
      catch (Exception ex) 
      { 
       // throw any errors as IO exceptions 
       throw new IOException("An error occurred while saving the object", ex); 
      } 
      finally 
      { 
       // if a stream is open 
       if (oWriter != null) 
       { 
        // close it 
        oWriter.Close(); 
       } 
      } 
     } 

     /// <summary> 
     /// Deserializes saved object data of type T in an XML file 
     /// located at filePath   
     /// </summary> 
     /// <typeparam name="T">Type of object to deserialize</typeparam> 
     /// <param name="filePath">The path to open the object from</param> 
     /// <returns>An object representing the file or the default value for type T</returns> 
     /// <exception cref="System.IO.IOException">Thrown if the file could not be opened. See inner exception for details</exception> 
     public static T Open<T>(String filePath) 
     { 
      // gets access to the file 
      StreamReader oReader = null; 

      // the deserialized data 
      Object data; 

      try 
      { 
       // Open a stream to the file 
       oReader = new StreamReader(filePath); 

       // Create a deserializer for the object's type 
       XmlSerializer oDeserializer = new XmlSerializer(typeof(T)); 

       // Deserialize the data and store it 
       data = oDeserializer.Deserialize(oReader.BaseStream); 

       // 
       // Return the deserialized object 
       // don't cast it if it's null 
       // will be null if open failed 
       // 
       if (data != null) 
       { 
        return (T)data; 
       } 
       else 
       { 
        return default(T); 
       } 
      } 
      catch (Exception ex) 
      { 
       // throw error 
       throw new IOException("An error occurred while opening the file", ex); 
      } 
      finally 
      { 
       // Close the stream 
       oReader.Close(); 
      } 
     } 
    } 
}