2009-06-23 67 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>