2010-03-30 4 views
2

Я должен генерировать XML в формате нижеСериализация классов в C#. вложенная XML

<objects> 
    <items> 
     <item ="delete"> 
      <searchfields> 
      <searchfield name="itemname" value="itemValue" /> 
      </searchfields> 
     </item> 
    </items> 
</objects> 

Так что я сгенерировал файл CS, используя xsd.exe путем преобразования выше XML в XSD.

xsd.exe -c -l:c# -n:XmlSerializationDeleteObject DeleteObject.xsd 

Файл CS, который сгенерирован, содержит 4 класса.

Вопрос в том, что мне нужно построить XML в вышеупомянутом формате, используя генерируемый класс. Я могу сериализовать файлы классов один за другим, которые реплицируют один тег за раз, но я не могу его построить так, как я упоминал выше.

Пожалуйста, помогите

Regardas, jebli

+0

Я немного неясно, о том, где проблема (т.е. там, где вы застряли) и совсем то, что вы имеете в виду с «один на один»/«не в состоянии построил» и т. д. Можете ли вы уточнить, что вы имеете в виду? –

ответ

4

Я думаю, что это нужно сделать, хочу, чтобы вы хотите. Я должен сказать, что я не использовал XSD для создания своих классов - я создал их с нуля.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Serialization; 
using System.Collections; 

namespace TestLibrary 
{ 
    [Serializable] 
    [XmlRoot("Objects")] 
    public class ObjectTest : ICollection 
    { 
     [XmlArray("Items")] 
     public Items[] items; 

     #region "Required for implementing ICollection" 
     //Default Accessor 
     public Items this[int index] 
     { 
      get { return (Items)items[index]; } 
     } 

     public void CopyTo(Array array, int index) 
     { 
      items.CopyTo(array, index); 
     } 

     public int Count 
     { 
      get { return items.Length; } 
     } 

     public bool IsSynchronized 
     { 
      get { return false; } 
     } 

     public object SyncRoot 
     { 
      get { return this; } 
     } 



     public IEnumerator GetEnumerator() 
     { 
      return items.GetEnumerator(); 
     } 

     public void Add(Items newItems) 
     { 
      if (this.items == null) 
      { 
       this.items = new Items[1]; 
      } 
      else 
      { 
       Array.Resize(ref this.items, this.items.Length + 1); 
      } 
      this.items[this.items.GetUpperBound(0)] = newItems; 

     } 
     #endregion 
    } 

    [Serializable] 
    public class Items 
    { 
     [XmlElement("Item")] 
     public Item item; 



    } 
    [Serializable] 
    public class Item 
    { 
     [XmlAttribute("itemType")] 
     public string itemType; 


     [XmlArray("SearchField")] 
     public SearchFields[] searchfields; 
    } 

    [Serializable] 
    public class SearchFields 
    { 

     [XmlAttribute("name")] 
     public string searchName; 

     [XmlAttribute("value")] 
     public string searchValue; 

    } 


} 

Это создало бы фактический XML-файл, который почти такой же, как ваш пример. Единственное различие состоит в том, что я думаю, что вам нужно будет иметь атрибут в элементе Item, чтобы держать "delete"

private void button1_Click(object sender, EventArgs e) 
     { 
      //Create the Serialize object to save the class to an XML file 
      XmlSerializer serializer = new XmlSerializer(typeof(ObjectTest)); 
      FileStream fs = new FileStream(@"C:\Objects.xml", FileMode.Create); 

      try 
      { 


       //Create new instances of each class to store the data 
       ObjectTest testing = new ObjectTest(); 
       Items newItems = new Items(); 
       Item newItem = new Item(); 
       SearchFields newSearch = new SearchFields(); 

       //Assign SearchField data 
       newSearch.searchName = "itemName"; 
       newSearch.searchValue = "itemValue"; 

       //Assign the item type 
       newItem.itemType = "delete"; 

       //Create a new array of SearchField objects 
       SearchFields[] testSearch = { newSearch }; 

       //Add the SearchField array to the Item class 
       newItem.searchfields = testSearch; 

       //Add the single Item class to the Items class 
       newItems.item = newItem; 

       //Create a new array of Items objects 
       Items[] testItems = { newItems }; 

       //Add the Items array to the ObjectTest class 
       testing.items = testItems; 

       //Serialize the object 
       serializer.Serialize(fs, testing); 


      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error: " + ex.ToString()); 
      } 
      finally 
      { 
       //close the objects 
       fs.Close(); 
       serializer = null; 

      } 



     } 

Позвольте мне знать, как вы получите на. Надеюсь, это то, что вы ищете.

благодаря

Barry

+0

Привет, спасибо за ответ. Это помогло мне. :) – Jebli

Смежные вопросы