13

XmlReader.ReadOuterXml() を使用すると、要素が \r\n ではなく \n で区切られます。したがって、たとえば、次の XmlDocument を表す場合

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

5 に答える 5

15

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");
于 2009-11-25T00:42:18.407 に答える
4

LINQ to XML を使用して、データベース データを xml ファイルに書き込み、xml ファイルから読み戻す必要がありました。レコード内の一部のフィールドは、それ自体が \r 文字で完全な xml 文字列でした。これらはそのままにしておく必要がありました。うまくいくものを探すのに何日も費やしましたが、Microsoft は意図的に \r を \n に変換しているようです。

次の解決策は私にとってはうまくいきます:

読み込まれた XDocument を \r をそのまま維持して XML ファイルに書き込むには、xDoc は XDocument で、filePath は文字列です。

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings 
    { NewLineHandling = NewLineHandling.None, Indent = true };
using (XmlWriter xmlWriter = XmlWriter.Create(filePath, xmlWriterSettings))
{
    xDoc.Save(xmlWriter);
    xmlWriter.Flush();
}

\r を変更せずに XML ファイルを XElement に読み込むには:

using (XmlTextReader xmlTextReader = new XmlTextReader(filePath) 
   { WhitespaceHandling = WhitespaceHandling.Significant })
{
     xmlTextReader.MoveToContent();
     xDatabaseElement = XElement.Load(xmlTextReader);
}
于 2011-08-16T16:37:02.780 に答える
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();

お奨めは、クレジットが当然であるクレジットを与える

于 2009-11-25T02:37:56.330 に答える
-2

XmlReader は、ファイルを書き込むのではなく、ファイルを読み取ります。リーダーに \n が表示される場合は、それがファイルに含まれているためです。\n と \r はどちらも空白であり、XML では意味的に同じです。データの意味や内容には影響しません。

編集:

それは Ruby ではなく C# のように見えます。binarycoder が言うように、ReadOuterXml は正規化された XML を返すように定義されています。通常、これはあなたが望むものです。生の XML が必要な場合はEncoding.UTF8.GetString(memStream.ToArray())、 ではなくを使用する必要がありますXmlReader

于 2009-11-25T00:32:47.723 に答える