2011-04-09 58 views

回答

0
+0

這這些有什麼好處? – 2011-04-15 11:30:32

0

最近我花了一些時間圍繞構建動態包裝XElementXDocument爲我的項目之一,你可以看看它here

想法完全相同,但我將實現分爲兩個獨立的類:DynamicXmlReaderDynamicXmlWriter,其中前者只能讀取元素和屬性,後來可以添加子元素和屬性。如果DynamicXmlReader找不到合適的子元素或屬性,則會引發異常,但DynamicXmlWriter會將它們添加到基礎XElement中。

例如,在這裏我的兩個單元測試,我正在使用的樣品從喬恩斯基特的書:

[TestCase] 
public void SkeetBookXmlTest() 
{ 
string books = 
@"<books> 
    <book name=""Mortal Engines""> 
    <author name=""Philip Reeve"" /> 
    </book> 
    <book name=""The Talisman""> 
    <author name=""Stephen King"" /> 
    <author name=""Peter Straub"" /> 
    </book> 
    <book name=""Rose""> 
    <author name=""Holly Webb"" /> 
    <excerpt>Rose was remembering the illustrations from Morally Instructive Tales for the Nursery.</excerpt> 
    </book> 
</books>"; 
    dynamic dynamicXml = XElement.Parse(books).AsDynamic(); 

    Assert.That(dynamicXml.book[0]["name"].Value, Is.EqualTo("Mortal Engines")); 

    Assert.That(dynamicXml.book[0].author["name"].Value, Is.EqualTo("Philip Reeve")); 

    Assert.That(dynamicXml.book[2]["name"].Value, Is.EqualTo("Rose")); 

    Assert.That((string)dynamicXml.book[2].excerpt, Is.EqualTo("Rose was remembering the illustrations from Morally Instructive Tales for the Nursery.")); 

} 

或者創建完全相同的XML文檔的另一個單元測試:

[TestCase] 
public void SkeetBookXmlTest() 
{ 
    // Jon Skeet in his C# in Depth used following sample 
    string books = 
@"<books> 
    <book name=""Mortal Engines""> 
    <author name=""Philip Reeve"" /> 
    </book> 
    <book name=""The Talisman""> 
    <author name=""Stephen King"" /> 
    <author name=""Peter Straub"" /> 
    </book> 
    <book name=""Rose""> 
    <author name=""Holly Webb"" /> 
    <excerpt>Rose was remembering the illustrations from Morally Instructive Tales for the Nursery.</excerpt> 
    </book> 
</books>"; 

// Lets create this data dynamically 
XElement element = new XElement("books"); 
dynamic dynamicXml = element.AsDynamicWriter(); 

dynamicXml.book[0]["name"] = "Mortal Engines"; 
dynamicXml.book[0].author["name"] = "Philip Reeve"; 

dynamicXml.book[1]["name"] = "The Tailisman"; 
dynamicXml.book[1].author[0]["name"] = "Stephen King"; 
dynamicXml.book[1].author[1]["name"] = "Peter Straub"; 

dynamicXml.book[2]["name"] = "Rose"; 
dynamicXml.book[2].author["name"] = "Holly Webb"; 
dynamicXml.book[2].excerpt = "Rose was remembering the illustrations from Morally Instructive Tales for the Nursery."; 

Console.WriteLine(element); 

Assert.That(dynamicXml.book[0]["name"].Value, Is.EqualTo("Mortal Engines")); 

Assert.That(dynamicXml.book[0].author["name"].Value, Is.EqualTo("Philip Reeve")); 

Assert.That(dynamicXml.book[2]["name"].Value, Is.EqualTo("Rose")); 

Assert.That((string)dynamicXml.book[2].excerpt, Is.EqualTo("Rose was remembering the illustrations from Morally Instructive Tales for the Nursery.")); 

} 
相關問題