【问题标题】:How can I change this StringBuilder-to-XML code to LINQ-to-XML?如何将此 StringBuilder-to-XML 代码更改为 LINQ-to-XML?
【发布时间】:2009-06-23 12:40:43
【问题描述】:

在我的应用程序中,我使用 StringBuilder 使用此代码构建了一个 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())
            ))
        )
    }
);

【问题讨论】:

  • 更新示例以显示 xmlwritersettings

标签: c# linq stringbuilder


【解决方案1】:

即使没有 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-to-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();

【讨论】:

  • xmlwriter 可以工作,但是当我将它放在我的 TextBox.Text 中时,它是一长行,如何让它在每一行之后插入 Environment.Newline?它说 xw.Settings.NewLineChars 是只读的。
【解决方案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>

【讨论】:

    【解决方案3】:

    如果你指的是这一行:

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

    而 _allDataTypes 是一个 List(注意不是 LinQ!)你可以这样做:

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

    请注意,这仅适用于 List。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多