2011-08-12 49 views
2

我一直在詛咒一個需要在InfoPath中創建應用程序的項目,該項目使用了巨大的表單。爲了訪問InfoPath XML中的數據,我選擇使用XSD實用程序來創建基於InfoPath生成的XML模式的序列化c#類。如何向c#XSD生成的序列化類中的數組添加元素?

由於InfoPath表單包含多個表,因此這些表以序列化類的數組形式實現。當讀取XML(反序列化)時,顯然正在分配和填充數組元素。我想不出什麼是如何添加額外的數組元素。例如,如果XML在表中有兩個條目,則該數組將分配兩個元素。但我想能夠添加額外的元素到數組中。

我試圖使用Array.Resize方法,但沒有多少運氣。

這聽起來很熟悉嗎?

- 湯姆

回答

3

我將利用的擴展方法(或部分類),以允許方便地添加項在由XSD.EXE創建的類的陣列。由於XSD.exe生成數組而不是列表,向數組添加元素有點麻煩。如果你使用擴展方法,你可以使這些類更容易處理。

下面的代碼示例是基於一組I使用下面的XML創建的類:

<?xml version="1.0" encoding="utf-8" ?> 
<Doc> 
    <Item Text="A" /> 
    <Item Text="B" /> 
    <Item Text="C" /> 
    <Item Text="D" /> 
</Doc> 

下面的程序反序列化上面的XML成Doc對象,並採取AddDocItem擴展方法的優勢將項目添加到Doc.Items陣列。 AddDocItem利用Array.Resize添加元素。

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

namespace TestConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var xmlSerialzer = new XmlSerializer(typeof(Doc)); 
      var doc = xmlSerialzer.Deserialize(
       new StreamReader(@"..\..\XmlFile1.xml")) as Doc; 
      if(doc == null) return; 
      doc.PrintDocItems(); 
      Console.WriteLine(); 

      //Add a couple new items 
      doc.AddDocItem(new DocItem { Text = "E" }); 
      doc.AddDocItem(new DocItem { Text = "F" }); 
      doc.PrintDocItems(); 
     } 
    } 

    public static class DocExtensions 
    { 
     public static void AddDocItem(this Doc doc, DocItem item) 
     { 
      var items = doc.Items; 
      Array.Resize(ref items, items.Length + 1); 
      items[items.Length - 1] = item; 
      doc.Items = items; 
     } 

     public static void PrintDocItems(this Doc doc) 
     { 
      foreach (var item in doc.Items) 
       Console.WriteLine(item.Text); 
     } 
    } 
} 

如果你不是的擴展方法球迷,你可以利用一個事實,即XSD.EXE生成的類是部分類和擴展類的方式。例如:

public partial class Doc 
{ 
    public void AddDocItem(DocItem item) 
    { 
     var items = Items; 
     Array.Resize(ref items, items.Length + 1); 
     items[items.Length - 1] = item; 
     Items = items; 
    } 

    public void PrintDocItems() 
    { 
     foreach (var item in Items) 
      Console.WriteLine(item.Text); 
    } 
} 

無論哪種方式應該工作正常。

通過XSD.EXE生成的代碼如下所示以供參考:

namespace TestConsoleApplication1 
{ 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
    [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
    public partial class Doc { 

     private DocItem[] itemsField; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute("Item", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public DocItem[] Items { 
      get { 
       return this.itemsField; 
      } 
      set { 
       this.itemsField = value; 
      } 
     } 
    } 

    /// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
    public partial class DocItem { 

     private string textField; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlAttributeAttribute()] 
     public string Text { 
      get { 
       return this.textField; 
      } 
      set { 
       this.textField = value; 
      } 
     } 
    } 
} 

希望有所幫助。

+0

這非常有幫助。 我結束了與xml2code而不是XSD。我發現它以一種在我的應用程序中使用起來更容易的方式生成序列化類。 謝謝! – tom

相關問題