【问题标题】:XDocument adds carriage return when generating final xml stringXDocument 在生成最终的 xml 字符串时添加回车
【发布时间】:2016-09-29 15:25:42
【问题描述】:

我有一个案例,我想在将其发布到 API 之前生成 xml,包含换行符 (\n) 但不包含回车符(无 \r)。

不过,在 C# 中,XDocument 似乎会在其 to-string 方法中自动添加回车:

var inputXmlString = "<root>Some text without carriage return\nthis is the new line</root>";

// inputXmlString: <root>Some text without carriage return\nthis is the new line</root>

var doc = XDocument.Parse(inputXmlString);

var xmlString = doc.Root.ToString();

// xmlString: <root>Some text without carriage return\n\rthis is the new line</root>

在 doc.Root.ToString() 中,在元素之间添加了一组 \n\r 用于缩进,这对于接收者对整个 xml 消息的解释无关紧要。但是,ToString() 方法还在我需要保留独立换行符的实际文本字段中添加了 \r(后面没有 \r 的 \n)。

我知道我可以进行最终字符串替换,在实际执行 HTTP 发布之前从最终字符串中删除所有回车,但这似乎是错误的。

使用 XElement 对象而不是 Document.Parse 构造 xml 文档时,问题是相同的。即使我使用 CData 元素来包装文本,问题也仍然存在。

如果我做错了什么,或者是否有一些干净的方法可以实现我尝试做的事情,谁能向我解释一下?

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:

    XNode.ToString 是一种便利,它在后台使用XmlWriter - 您可以在reference source 中查看代码。

    the documentationXmlWriterSettings.NewLineHandling

    替换设置告诉 XmlWriter 用 \r\n 替换新行字符,这是 Microsoft Windows 操作系统使用的新行格式。这有助于确保记事本或 Microsoft Word 应用程序可以正确显示文件。此设置还将属性中的新行替换为字符实体以保留字符。 这是默认值。

    这就是为什么当您将元素转换回字符串时会看到这种情况的原因。如果你想改变这种行为,你必须用你自己的XmlWriterSettings创建你自己的XmlWriter

    var settings = new XmlWriterSettings
    {
        OmitXmlDeclaration = true,        
        NewLineHandling =  NewLineHandling.None
    };
    
    string xmlString;
    
    using (var sw = new StringWriter())
    {
        using (var xw = XmlWriter.Create(sw, settings))
        {
            doc.Root.WriteTo(xw);                    
        }
        xmlString = sw.ToString();
    }
    

    【讨论】:

      【解决方案2】:

      你试过了吗:

      how to remove carriage returns, newlines, spaces from a string

      string result = XElement.Parse(input).ToString(SaveOptions.DisableFormatting);
      Console.WriteLine(result);
      

      【讨论】:

      • 没有区别
      • 这解决了我的问题,因为执行 xdoc.Root.Value 保留了所有格式,但执行 xdoc.Root?.ToString() 正在删除回车符。谢谢!
      【解决方案3】:

      其他答案对我不起作用(在我将其转换为 VB 之后)

      但是这样做了:

      返回 xDoc.ToString(SaveOptions.DisableFormatting)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        • 2018-08-02
        • 2012-01-11
        • 1970-01-01
        相关资源
        最近更新 更多