当我使用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();
}
}
答案 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
使用配置良好的XmlWriter
和NewLineHandling.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
。