2008-09-16 14 views
0

XML'e serileştirmek için kullanılacak bir dizi sınıf üzerinde çalışıyorum. XML benim tarafımdan kontrol edilmiyor ve oldukça iyi organize ediliyor. Ne yazık ki, iç içe geçmiş düğümlerin birkaç kümesi vardır, bazılarının amacı sadece çocuklarının bir koleksiyonunu tutmaktır. Şu anki XML Serileştirme bilgisine dayanarak, bu düğümler başka bir sınıf gerektirir..NET XML Seralizasyon

Bir sınıf yerine bir dizi XML düğümüne seri hale getirmenin bir yolu var mı?

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

İdeal olarak, 3 sınıflar iyi olurdu: Ben anlaşılmaz şey davranıyorum gibi düşündüğümüzden, xml olduğunu varsayalım. root sınıfından user ve group nesnelerin koleksiyonları. Ancak, ben anlamaya en iyi ben users ve groups sırasıyla user ve group sadece koleksiyonları içeren root, users, user, groups ve group, için bir sınıf gerektiğini ve root bir users ve groups nesnesi içerir.

Benden daha iyi bilen var mı? (yalan söyleme, orada olduğunu biliyorum).

cevap

6

kullanmıyor musunuz? Oldukça iyi lanet ve bu kadar kolay şeyler yapmakta zorlanıyorum (oldukça fazla kullanıyorum!).

Sadece bazı özellikleriyle sınıf özelliklerini dekore edebilirsiniz ve geri kalan tüm

Eğer XmlSerializer'ı kullanmayı düşündünüz mü ya da belli bir nedeni orada değil .. sizin için yapılır?

İşte gerekli tüm çalışmaların bir kod parçacığı yukarıdaki (her iki yönde) seri hale getirmek için:

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

XMLSerializer kullanıyorum, ancak en iyi şekilde, bir sınıf veya özellik için yalnızca tek bir öğe adı uygulayabilirsiniz. Yaptıklarımın, diğer nesnelerin koleksiyonlarını tuttuğu birkaç aracı sınıfı var. Sonuç doğru XML'dir, ama popodaki bir ağrı kendimi yaratır. –

+0

Demoya kod eklendi :) –

+0

@Rob Cooper: Kod yumruğu beni yenmek için +1. – user7116

0

Sen Kullanıcı nesnelerinin bir dizi olarak tanımlanan Kullanıcıları'nın sadece gerekir. XmlSerializer sizin için uygun şekilde işleyecektir. Ben http://quickstart.developerfusion.co.uk/quickstart/howto/doc/xmlserialization/XSDToCls.aspx

uyarınca, bir XSD oluşturmak için Visual Studio kullanarak ve sizin için sınıf hiyerarşisini tükürmek için komut yarar Xsd.exe kullanarak öneriyoruz, Ayrıca http://www.informit.com/articles/article.aspx?p=23105&seqNum=4

:

bir örnek için bu bağlantıya bakın

0

Bu dersi, yazdığım şeyi yapmak için güne yazdım, yapmaya çalıştığınız şeye benziyor. XML'ye serileştirmek istediğiniz nesneler üzerinde bu sınıfın yöntemlerini kullanırsınız. Örneğin, bir Yardımcı Çalışanlar kullanarak bir çalışanın verilen ...

; System.Xml kullanarak .Serile;

[XmlRoot ("çalışan")] genel sınıf Personel { Özel String adı = "Steve";

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

nesne türü (çalışan) seri olmalıdır:

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

}

bu kod çıkış gerekir. [Serializable (true)] 'ı deneyin. Bu kodun daha iyi bir versiyonuna sahibim, sadece yazdığım zaman öğreniyordum. Neyse, aşağıdaki kodu kontrol edin. Bazı projelerde kullanıyorum, bu yüzden kesinlikle işe yarıyor.

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(); 
      } 
     } 
    } 
} 
İlgili konular