生成最终的xml字符串时,XDocument会添加回车符

时间:2016-09-29 15:25:42

标签: c# xml linq-to-xml

我有一个案例,我希望在将其发布到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 \ n我需要保留独立换行符(\ n后面没有\ r \ n)。

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

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

任何人都可以向我解释,如果我做错了什么或者是否有一些干净的方式来实现我的目标?

3 个答案:

答案 0 :(得分:4)

XNode.ToString是一种使用XmlWriter的便利 - 您可以在reference source中看到代码。

XmlWriterSettings.NewLineHandling的每the documentation条:

  

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

因此,当您将元素转换回字符串时,您就会看到这一点。如果您想要更改此行为,则必须使用自己的XmlWriter创建自己的XmlWriterSettings

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();
}

答案 1 :(得分:2)

你试过了吗?

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

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

答案 2 :(得分:0)

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

但是这样做:

返回xDoc.ToString(SaveOptions.DisableFormatting)