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

时间:2009-11-25 00:22:09

标签: .net newline xmlreader

当我使用XmlReader.ReadOuterXml()时,元素由\ n而不是\ r \ n分隔。 所以,例如,如果我有

的XmlDocument representatino
<A>
<B>
</B>
</A>

我得到了

<A>\n<B>\n</B>\n</A>

是否有指定换行符的选项? 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();
    }
}

5 个答案:

答案 0 :(得分:13)

XmlReader会自动将\r\n\标准化为\n。虽然这在Windows上看起来很不寻常,但实际上它需要XML规范(http://www.w3.org/TR/2008/REC-xml-20081126/#sec-line-ends)。

您可以执行String.Replace

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

答案 1 :(得分:4)

我必须使用LINQ to XML将数据库数据写入xml文件并从xml文件中读回。记录中的某些字段本身是xml字符串,其中包含\ r \ n字符。这些必须保持完整。我花了几天时间试图找到可行的东西,但似乎微软是通过设计将\ r转换为\ 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);
}

答案 2 :(得分:3)

解决方案1:编写授权XML

使用配置良好的XmlWriterNewLineHandling.Entitize选项,以便XmlReader不会消除规范化行结尾。

即使XmlWriter

,您也可以使用此类自定义XDocument
xDoc.Save(XmlWriter.Create(fileName, new XmlWriterSettings { NewLineHandling = NewLineHandling.Entitize }));

解决方案2:阅读未经规范化的未授权XML

解决方案1是更清洁的方式;但是,您可能已经拥有了未授权的XML,并且无法修改创建,但仍希望阻止规范化。接受的答案暗示了替换,但即使不可取,也会盲目地替换每一次。要检索文件中的所有行结尾,您可以尝试使用遗留的XmlTextReader类,默认情况下不会规范化XML文件。您也可以将其与XDocument一起使用:

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

答案 3 :(得分:0)

如果您只是想尝试使用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();

在信用额度due时给予信用。

答案 4 :(得分:-1)

XmlReader读取文件,而不是写入文件。如果你正在读取你的读者,那是因为这就是文件中的内容。 \ n和\ r都是空格,在XML中语义相同,不会影响数据的含义或内容。

编辑:

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