【问题标题】:XML writer with custom formatting具有自定义格式的 XML 编写器
【发布时间】:2014-07-23 11:17:15
【问题描述】:

我需要创建一个人类可读的 XML 文件。 XmlWriter 似乎对此几乎是完美的,但我想在我想要的地方插入换行符,或者一般来说,自定义空格。 WriteRawWriteWhitespace 似乎都不能在元素的属性之间工作。后者看起来应该可以工作(此方法用于手动格式化文档),但会抛出 InvalidOperationException状态元素内容中的令牌 StartAttribute 会导致 XML 文档无效 em>) 如果用于代替下面的 cmets。

是否有针对 XmlWriter 或支持此功能的第三方 XML 库的解决方法?

示例代码(准备好LINQPad语句):

var sb = new StringBuilder();
var settings = new XmlWriterSettings {
    OmitXmlDeclaration = true,
    Indent = true,
    IndentChars = "  ",
};
using (var writer = XmlWriter.Create(sb, settings)) {
    writer.WriteStartElement("X");
    writer.WriteAttributeString("A", "1");
    // write line break
    writer.WriteAttributeString("B", "2");
    // write line break
    writer.WriteAttributeString("C", "3");
    writer.WriteEndElement();
}
Console.WriteLine(sb.ToString());

实际结果:

<X A="1" B="2" C="3" />

想要的结果(B 和 C 可能与 A 不对齐 - 没关系,/> 可以留在 C 行):

<X A="1"
   B="2"
   C="3"
/>

【问题讨论】:

  • human-readable XML file: 闻起来像规格蠕变!
  • @Rawling,忘了提 - 我不希望它们都在新行上,只是在上下文中有意义的地方(即仅手动添加)
  • 哦,我明白你的意思了! (只是没有及时避免将我的评论变成答案......)

标签: c# xml formatting


【解决方案1】:

您仍然拥有后台 StringBuilder - 使用它。 :

  var sb = new StringBuilder();
  var settings = new XmlWriterSettings {
    OmitXmlDeclaration = true,
    Indent = true,
    IndentChars = "  ",
  };
  using (var writer = XmlWriter.Create(sb, settings)) {
    writer.WriteStartElement("X");
    writer.WriteAttributeString("A", "1");
    writer.Flush();
    sb.Append("\r\n");
    writer.WriteAttributeString("B", "2");
    writer.Flush();
    sb.Append("\r\n");
    writer.WriteAttributeString("C", "3");
    writer.WriteEndElement();
  }
  Console.WriteLine(sb.ToString());

【讨论】:

  • 啊,是的,出于某种原因没有想到这一点。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多