2009-06-23 52 views
2

在我的應用程序建立使用StringBuilder的這段代碼的XML文件:如何將此StringBuilder-XML代碼更改爲LINQ-to-XML?

StringBuilder sb = new StringBuilder(); 
sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + Environment.NewLine); 

sb.Append(String.Format("<{0}>{1}", _pluralCamelNotation, Environment.NewLine)); 
for (int index = 0; index < 3; index++) 
{ 
    sb.Append(String.Format("\t<{0}>{1}", _singularCamelNotation, Environment.NewLine)); 
    foreach (DataType dataType in _allDataTypes) 
    { 
     sb.Append(String.Format("\t\t<{0}>{2}</{0}>{1}", dataType.CamelCaseNotation, Environment.NewLine, dataType.GetDummyData())); 
    } 
    sb.Append(String.Format("\t</{0}>{1}", _singularCamelNotation, Environment.NewLine)); 
} 
sb.Append(String.Format("</{0}>{1}", _pluralCamelNotation, Environment.NewLine)); 

return sb.ToString(); 

我怎樣才能做到同樣的事情LINQ,這樣的事情:

PSEUDO-CODE: 

var xdoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null), 
    for (int index = 0; index < 3; index++) { 
     new XElement(_pluralCamelNotation, 
      _allDataTypes.Select(datatype => new XElement(_singularCamelNotation, 
       new XElement(datatype.CamelCaseNotation, datatype.GetDummyData()) 
      )) 
     ) 
    } 
); 
+0

更新的例子來說明xmlwritersettings – 2009-06-23 13:31:25

回答

11

即使沒有LINQ,你不應該通過串聯寫xml ... XmlWriter將是一個不錯的選擇:

XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.NewLineHandling = NewLineHandling.Entitize; 
    settings.Indent = true; 
    settings.IndentChars = "\t"; 

    StringBuilder sb = new StringBuilder(); 
    using (XmlWriter xw = XmlWriter.Create(sb, settings)) 
    { 
     xw.WriteStartDocument(); 
     xw.WriteStartElement(_pluralCamelNotation); 
     for (int i = 0; i < 3; i++) 
     { 
      xw.WriteStartElement(_singularCamelNotation); 
      foreach (DataType dataType in _allDataTypes) 
      { 
       xw.WriteElementString(dataType.ToString(), 
        dataType.GetDummyData()); 
      } 
      xw.WriteEndElement(); 
     } 
     xw.WriteEndElement(); 
     xw.WriteEndDocument(); 
     xw.Close(); 
    } 

您可以使用XmlWriterSettings來控制諸如行距之類的東西。

或者,LINQ到XML:

XDocument doc = new XDocument(
     new XDeclaration("1.0", null, null), 
     new XElement(_pluralCamelNotation, 
      Enumerable.Range(1,3).Select(
       i => new XElement(_singularCamelNotation, 
        _allDataTypes.Select(
         dataType => new XElement(
          dataType.ToString(), 
          dataType.GetDummyData()) 
        ) 
      )))); 

    string t = doc.ToString(); 
+0

的XmlWriter的作品,但是當我把它放在我TextBox.Text它,它一個長行,我怎樣才能讓它在每一行後面插入Environment.Newline?它說xw.Settings.NewLineChars是隻讀的。 – 2009-06-23 12:59:52

0

如果你的意思是該行:

_allDataTypes.Select(datatype => new XElement(_singularCamelNotation, 
       new XElement(datatype.CamelCaseNotation, datatype.GetDummyData()) 
      )) 

和_allDataTypes是一個列表(注意是沒有的LinQ!),你可以這樣做:

_allDataTypes.ForEach(datatype => new XElement(_singularCamelNotation, 
       new XElement(datatype.CamelCaseNotation, datatype.GetDummyData()) 
      )) 

請注意,這僅適用於List。

2

這是VB.Net使用XML文字勝過C#的一個領域。看看這個代碼取自http://blogs.msdn.com/jimoneil/archive/2009/06/15/x-is-for-xml-literal.aspx。這不美嗎?

Dim xml = <?xml version="1.0"?> 
     <menu> 
      <course name="appetizer"> 
       <%= From m In menu _ 
        Where m.Course = "appetizer" _ 
        Select <dish><%= m.Food %></dish> _ 
       %> 
      </course> 
      <course name="main"> 
       <%= From m In menu _ 
        Where m.Course = "main" _ 
        Select <dish><%= m.Food %></dish> _ 
       %> 
      </course> 
      <course name="dessert"> 
       <%= From m In menu _ 
        Where m.Course = "dessert" _ 
        Select <dish><%= m.Food %></dish> _ 
       %> 
      </course> 
     </menu>