0

XML へのシリアル化に使用される一連のクラスに取り組んでいます。XML は私が管理しているものではなく、かなりうまく構成されています。残念ながら、ネストされたノードのセットがいくつかあります。それらのいくつかの目的は、子のコレクションを保持することだけです。XML シリアライゼーションに関する私の現在の知識に基づくと、これらのノードには別のクラスが必要です。

クラスを 1 つだけではなく一連の XML ノードにシリアル化する方法はありますか。泥のようにはっきりしているように感じるので、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クラスが最適です。オブジェクトrootのコレクションをuser持つクラス。groupただし、私が理解できる最善の方法は、 、 、 、および のクラスが必要でありrootusersおよびusergroupsgroupそれぞれusersおよびのコレクションgroupsのみが含まれ、 およびオブジェクトが含まれているということです。usergrouprootusersgroups

私よりよく知っている人はいますか?(嘘をつかないでください、私はあることを知っています)。

4

3 に答える 3

6

XmlSerializerを使用していませんか? これは非常に優れており、このようなことを非常に簡単に行うことができます (私はかなり頻繁に使用しています!)。

クラスのプロパティをいくつかの属性で装飾するだけで、残りはすべてあなたのために行われます..

XmlSerializer の使用を検討しましたか、それとも特別な理由がありますか?

上記をシリアル化するために必要なすべての作業のコード スニペットを次に示します (両方の方法)。

[XmlArray("users"),
XmlArrayItem("user")]
public List<User> Users
{
    get { return _users; }
}
于 2008-09-16T20:43:18.677 に答える
0

私は、あなたがやろうとしていることと似ていると思うことをするために、このクラスを昔に書きました。XML にシリアル化するオブジェクトに対して、このクラスのメソッドを使用します。たとえば、従業員がいるとします...

ユーティリティの使用; System.Xml.Serialization を使用します。

[XmlRoot("従業員")] public class Employee { private String name = "Steve";

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

}

このコードは次を出力する必要があります。

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

オブジェクト型 (Employee) はシリアライズ可能である必要があります。[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();
            }
        }
    }
}
于 2008-09-16T21:21:36.803 に答える
0

ユーザー オブジェクトの配列としてユーザーを定義するだけで済みます。XmlSerializer はそれを適切にレンダリングします。

例については、次のリンクを参照してください: http://www.informit.com/articles/article.aspx?p=23105&seqNum=4

さらに、http: //quickstart.developerfusion.co.uk/quickstart/howto/doc/xmlserializationに従って、Visual Studio を使用して XSD を生成し、コマンドライン ユーティリティ XSD.EXE を使用してクラス階層を吐き出すことをお勧めします。/XSDToCls.aspx

于 2008-09-16T20:47:20.820 に答える