2

ServiceStack.Text が xml 出力をインデントして、1 行の長い xml にならないようにすることは可能ですか? 出力を読みやすいテキスト ファイルに書きたいと思います。

4

1 に答える 1

2

任意の種類のエンコーディングを使用していますか。デフォルトでは、オブジェクトをシリアル化するときにインデントの削除が発生しないためです。以下のコードを試してください。

xml クラス オブジェクト

 public class MyXMLClass
{
    [XmlElement]
    public string[] Property1 { get; set; }
    [XmlElement]
    public string[] Property2 { get; set; }
}    

シリアル化方法

static void TestXMLWithIndent()
    { 
        var x = new MyXMLClass()
        {
            Property1 = new string[] { "TestProp11", "TestProp12", "TestProp13" },
            Property2 = new string[] { "TestProp21", "TestProp22", "TestProp23" }
        };
        var filename = @"c:\temp\testxmlWithIndent.oxi";
        using (TextWriter textWriter = new StreamWriter(filename))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(MyXMLClass));
            serializer.Serialize(textWriter, x);
            textWriter.Close();
        }
    }

このコードは正しいインデントを生成します。あなたが言及したように、以下のコードはインデントのないxmlファイルを生成します。xmltextwriter を使用するときは、エンコーディングを使用する必要があることに注意してください。

 static void XmlWithNoIndent()
    {
        var x = new MyXMLClass()
        {
            Property1 = new string[] { "TestProp11", "TestProp12", "TestProp13" },
            Property2 = new string[] { "TestProp21", "TestProp22", "TestProp23" }
        };
        var filename = @"c:\temp\testxmlWithNoIndent.oxi"; 
        using (MemoryStream memoryStream = new MemoryStream())
        {
            using (var xmlTextWriter = new System.Xml.XmlTextWriter(memoryStream, Encoding.Unicode))
            {
                XmlSerializer xs = new XmlSerializer(typeof(MyXMLClass));
                xs.Serialize(xmlTextWriter, x);

                MemoryStream memoryBaseStream;
                memoryBaseStream = (MemoryStream)xmlTextWriter.BaseStream;
                UTF8Encoding encoding = new UTF8Encoding();
                File.WriteAllBytes(filename, memoryStream.ToArray());
                memoryBaseStream.Dispose();
                xmlTextWriter.Close();
                memoryStream.Close();
            }
        }
    }
于 2013-06-28T13:08:27.630 に答える