我有一个案例,我希望在将其发布到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元素来包装文本,问题也会持续存在。
任何人都可以向我解释,如果我做错了什么或者是否有一些干净的方式来实现我的目标?
答案 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)