.net xmlreader换行符\n而不是\r\n

.net xmlreader换行符\n而不是\r\n,.net,newline,xmlreader,.net,Newline,Xmlreader,使用XmlReader.ReadOuterXml()时,元素之间用\n而不是\r\n分隔。 例如,如果我有xmldocumentrepresentatino <A> <B> </B> </A> 我明白了 \n\n\n 是否有指定换行符的选项?XmlWriterSettings有它,但XmlReader似乎没有 下面是我读取xml的代码。请注意,XmlWriterSettings在默认情况下具有NewLineHandling=Replace

使用XmlReader.ReadOuterXml()时,元素之间用\n而不是\r\n分隔。 例如,如果我有xmldocumentrepresentatino

<A>
<B>
</B>
</A>

我明白了

\n\n\n
是否有指定换行符的选项?XmlWriterSettings有它,但XmlReader似乎没有

下面是我读取xml的代码。请注意,XmlWriterSettings在默认情况下具有NewLineHandling=Replace

XmlDocument xmlDocument = <Generate some XmlDocument>
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;

// Use a memory stream because it accepts UTF8 characters.  If we use a 
// string builder the XML will be UTF16.
using (MemoryStream memStream = new MemoryStream())
{
    using (XmlWriter xmlWriter = XmlWriter.Create(memStream, settings))
    {
        xmlDocument.Save(xmlWriter);
    }

    //Set the pointer back to the beginning of the stream to be read
    memStream.Position = 0;
    using (XmlReader reader = XmlReader.Create(memStream))
    {
        reader.Read();
        string header = reader.Value;
        reader.MoveToContent();
        return "<?xml " + header + " ?>" + Environment.NewLine + reader.ReadOuterXml();
    }
}
XmlDocument XmlDocument=
XmlWriterSettings=新的XmlWriterSettings();
settings.Indent=true;
//使用内存流,因为它接受UTF8字符。如果我们使用
//字符串生成器XML将是UTF16。
使用(MemoryStream memStream=new MemoryStream())
{
使用(XmlWriter=XmlWriter.Create(memStream,settings))
{
保存(xmlWriter);
}
//将指针设置回要读取的流的开头
memStream.Position=0;
使用(XmlReader=XmlReader.Create(memStream))
{
reader.Read();
字符串头=reader.Value;
reader.MoveToContent();
返回“+Environment.NewLine+reader.ReadOuterXml();
}
}

XmlReader读取文件,而不是写入文件。如果您正在读取器中获取\n,这是因为该文件中包含此内容。\n和\r都是空白,在XML中语义相同,不会影响数据的含义或内容

编辑:
那看起来像C#,不是Ruby。正如binarycoder所说,ReadOuterXml被定义为返回规范化的XML。通常这就是你想要的。如果需要原始XML,应使用
Encoding.UTF8.GetString(memStream.ToArray())
,而不是
XmlReader

XmlReader
将自动将
\r\n\
标准化为
\n
。虽然这在Windows上似乎不常见,但实际上是XML规范()所要求的

您可以执行
字符串。替换

string s = reader.ReadOuterXml().Replace("\n", "\r\n");

如果你只是想去UTF-8,有一个更快的方法。首先创建一个编写器:

public class EncodedStringWriter : StringWriter
{
    public EncodedStringWriter(StringBuilder sb, Encoding encoding)
        : base(sb)
    {
        _encoding = encoding;
    }

    private Encoding _encoding;

    public override Encoding Encoding
    {
        get
        {
            return _encoding;
        }
    }

}
然后使用它:

XmlDocument doc = new XmlDocument();
doc.LoadXml("<foo><bar /></foo>");

StringBuilder sb = new StringBuilder();
XmlWriterSettings xws = new XmlWriterSettings();
xws.Indent = true;

using( EncodedStringWriter w = new EncodedStringWriter(sb, Encoding.UTF8) )
{
    using( XmlWriter writer = XmlWriter.Create(w, xws) )
    {
        doc.WriteTo(writer);
    }
}
string xml = sb.ToString();
XmlDocument doc=新的XmlDocument();
doc.LoadXml(“”);
StringBuilder sb=新的StringBuilder();
XmlWriterSettings xws=新的XmlWriterSettings();
xws.Indent=true;
使用(EncodedStringWriter w=新的EncodedStringWriter(sb,Encoding.UTF8))
{
使用(XmlWriter=XmlWriter.Create(w,xws))
{
书面文件(作者);
}
}
字符串xml=sb.ToString();

必须在有信用的地方给予信用。

我必须将数据库数据写入xml文件,并使用LINQ to xml从xml文件中读取数据。记录中的某些字段本身是包含\r\n个字符的xml字符串。这些必须保持完整。我花了几天的时间试图找到一些可行的方法,但似乎Microsoft是通过设计将\r\n转换为\n的

以下解决方案适合我:

要将加载的XDocument写入XML文件并保持\r完整,其中xDoc是XDocument,filePath是字符串:

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings 
    { NewLineHandling = NewLineHandling.None, Indent = true };
using (XmlWriter xmlWriter = XmlWriter.Create(filePath, xmlWriterSettings))
{
    xDoc.Save(xmlWriter);
    xmlWriter.Flush();
}
要将XML文件读入保持\r完整的XElement,请执行以下操作:

using (XmlTextReader xmlTextReader = new XmlTextReader(filePath) 
   { WhitespaceHandling = WhitespaceHandling.Significant })
{
     xmlTextReader.MoveToContent();
     xDatabaseElement = XElement.Load(xmlTextReader);
}

解决方案1:编写实体化XML

使用配置良好的
XmlWriter
NewLineHandling.Entitize
选项,使
XmlReader
不会消除或规范行结尾

即使与
XDocument
一起使用,您也可以使用这样的自定义
XmlWriter

xDoc.Save(XmlWriter.Create(fileName, new XmlWriterSettings { NewLineHandling = NewLineHandling.Entitize }));
解决方案2:在不进行规范化的情况下读取非实体化XML

解决方案1是更清洁的方式;但是,您可能已经有了非实体化的XML,并且无法修改创建,并且仍然希望阻止规范化。被接受的答案建议替换,但它会盲目地替换每一个\n出现的事件,即使它不可取。要检索文件中的所有行尾,可以尝试使用传统的
XmlTextReader
类,默认情况下,该类不会规范化XML文件。您也可以将其与
XDocument
一起使用:

var xDoc = XDocument.Load(new XmlTextReader(fileName));

多尔,我添加了我的代码。如果我将XmlWriter与NewLineHandling=Replace一起使用,它是否应该写入正确的字符串?非常感谢您的帮助,非常感谢!这是因为XmlTextReader的规范化设置默认为false,这与XmlReader.Create不同,XmlTextReader.Create无论如何都会规范化换行符。请参阅,当输入xml混合了\r\n和\n,并且下游系统对两者之间的差异很敏感时,本文末尾的注释会更麻烦,例如,Xml文档是一种中间状态,用于在使用特定分隔符将输出编码到平面文件之前执行xslt转换。为了跨平台兼容性,我建议使用
.Replace(“\n”,Environment.NewLine)
,但如果您的环境已修复,则功能相同。
var xDoc = XDocument.Load(new XmlTextReader(fileName));