我將利用的擴展方法(或部分類),以允許方便地添加項在由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;
}
}
}
}
希望有所幫助。
這非常有幫助。 我結束了與xml2code而不是XSD。我發現它以一種在我的應用程序中使用起來更容易的方式生成序列化類。 謝謝! – tom