我有東西接近,但不完全的Xml你想要的。實際上,我認爲你會發現下面生成的Xml比你擁有的更有意義。
爲了幫助您入門,您可以使用System.Xml.Serialization
namespace中的屬性控制序列化和反序列化。一些有用的例子來閱讀了關於是
於是我嘲笑了其中一些符合您自己的代碼。注意添加了一些屬性來指示序列化程序如何佈局Xml。
[XmlInclude(typeof(AsciiValidator))]
[XmlInclude(typeof(RequiredValidator))]
[XmlInclude(typeof(StringLengthValidator))]
public class FieldValidator
{
[XmlElement("Next")]
public FieldValidator Next
{
get;
set;
}
[XmlElement("PropertyName")]
public string PropertyName
{
get;
set;
}
}
public class AsciiValidator: FieldValidator
{
}
public class RequiredValidator: FieldValidator
{
}
public class StringLengthValidator: FieldValidator
{
[XmlElement]
public int MinLength{get;set;}
[XmlElement]
public int MaxLength{get;set;}
}
[XmlRoot("ValidatorList")]
public class ValidatorList : List<FieldValidator>
{
}
興趣點;每一個類繼承FieldValidator
必須加到用XmlIncludeAttribute
所以串行知道如何處理他們做)
然後,我創建了一個例子對象映射已知類型的列表:
var test = new ValidatorList();
test.Add(
new RequiredValidator()
{
PropertyName="CustRef",
Next = new AsciiValidator()
});
test.Add(
new RequiredValidator()
{
PropertyName="CurrencyIndicator",
Next = new StringLengthValidator(){
MinLength=3,
MaxLength = 10
}
});
最後我告訴序列化序列化(並把結果輸出到控制檯)
var ser = new XmlSerializer(typeof(ValidatorList));
ser.Serialize(Console.Out,test);
這是結果:
<?xml version="1.0" encoding="utf-8"?>
<ValidatorList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FieldValidator xsi:type="RequiredValidator">
<Next xsi:type="AsciiValidator" />
<PropertyName>CustRef</PropertyName>
</FieldValidator>
<FieldValidator xsi:type="RequiredValidator">
<Next xsi:type="StringLengthValidator">
<MinLength>3</MinLength>
<MaxLength>10</MaxLength>
</Next>
<PropertyName>CurrencyIndicator</PropertyName>
</FieldValidator>
</ValidatorList>
距離你想要的不遠一百萬英里。需要以某種方式輸出某些東西(例如xsi:type
告訴序列化程序如何反序列化回到對象圖)。我希望這給你一個好的開始。
這是一個活生生的,工作示例:http://rextester.com/OXPOB95358
反序列化可以通過調用的XmlSerializer的Deserialize
方法來完成。
例如,如果你的XML是一個字符串:
var ser = new XmlSerializer(typeof(ValidatorList));
var test = "<..../>" // Your Xml
var xmlReader = XmlReader.Create(new StringReader(test));
var validatorList = (ValidatorList)ser.Deserialize(xmlReader);
有反序列化的許多覆蓋其採取具體取決於該數據流中的現有閱讀器,或者保存到文件不同的輸入。
僅供參考將對象轉換爲數據流(如Xml)的過程是*序列化*。 *反序列化*是另一種方式。我已經用正確的短語更新了你的問題,以使其更清晰 – Jamiec