Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串属性的xml序列化中的缩进文本?_C#_.net_Xml Serialization_Indentation - Fatal编程技术网

C# 字符串属性的xml序列化中的缩进文本?

C# 字符串属性的xml序列化中的缩进文本?,c#,.net,xml-serialization,indentation,C#,.net,Xml Serialization,Indentation,我有一个字符串属性,它将包含带有换行符的文本。此文本具有HTML文本的某些属性,即忽略空白 如果我使用XML序列化来序列化此类型,则换行符被正确序列化,但缩进是“错误的”。我希望序列化过程缩进行以保持XML的格式,因为这些空白字符稍后将被忽略 下面是一个示例程序: 实际产量: <?xml version="1.0" encoding="utf-16"?> <dummy> <text>Line 1 Line 2 Line 3</text> <

我有一个字符串属性,它将包含带有换行符的文本。此文本具有HTML文本的某些属性,即忽略空白

如果我使用XML序列化来序列化此类型,则换行符被正确序列化,但缩进是“错误的”。我希望序列化过程缩进行以保持XML的格式,因为这些空白字符稍后将被忽略

下面是一个示例程序:

实际产量:

<?xml version="1.0" encoding="utf-16"?>
<dummy>
  <text>Line 1
Line 2
Line 3</text>
</dummy>

第1行
第2行
第3行
期望输出:

<?xml version="1.0" encoding="utf-16"?>
<dummy>
  <text>
    Line 1
    Line 2
    Line 3
  </text>
</dummy>

第1行
第2行
第3行
这可能吗?如果是,怎么做?我不想做那种只在自己身上加上空白的粗俗方式


这样做的原因是,人们将查看和编辑此XML,因此我希望初始输出的格式更好,便于他们开箱即用。

我遇到了同样的问题。最后,我推出了一个定制的作家:

public class IndentTextXmlWriter : XmlTextWriter
{
    private int indentLevel;
    private bool isInsideAttribute;

    public IndentTextXmlWriter(TextWriter textWriter): base(textWriter)
    {
    }

    public bool IndentText { get; set; }

    public override void WriteStartAttribute(string prefix, string localName, string ns)
    {
        isInsideAttribute = true;
        base.WriteStartAttribute(prefix, localName, ns);
    }

    public override void WriteEndAttribute()
    {
        isInsideAttribute = false;
        base.WriteEndAttribute();
    }

    public override void WriteStartElement(string prefix, string localName, string ns)
    {
        indentLevel++;
        base.WriteStartElement(prefix, localName, ns);
    }

    public override void WriteEndElement()
    {
        indentLevel--;
        base.WriteEndElement();
    }

    public override void WriteString(string text)
    {
        if (String.IsNullOrEmpty(text) || isInsideAttribute || Formatting != Formatting.Indented || !IndentText || XmlSpace == XmlSpace.Preserve)
        {
            base.WriteString(text);
            return;
        }

        string[] lines = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        string indent = new string(IndentChar, indentLevel * Indentation);
        foreach (string line in lines)
        {
            WriteRaw(Environment.NewLine);
            WriteRaw(indent);
            WriteRaw(line.Trim());
        }

        WriteRaw(Environment.NewLine);
        WriteRaw(new string(IndentChar, (indentLevel - 1) * Indentation));
    }
}
您可以这样使用它:

[TestMethod]
public void WriteIndentedText()
{
    var result = new StringBuilder();
    using (var writer = new IndentTextXmlWriter(new StringWriter(result)){Formatting = Formatting.Indented, IndentText = true})
    {
        string text = @" Line 1
Line 2
    Line 3  ";
        // some root
        writer.WriteStartDocument();
        writer.WriteStartElement("root");
        writer.WriteStartElement("child");

        // test auto-indenting
        writer.WriteStartElement("elementIndented");
        writer.WriteString(text);
        writer.WriteEndElement();

        // test space preserving
        writer.WriteStartElement("elementPreserved");
        writer.WriteAttributeString("xml", "space", null, "preserve");
        writer.WriteString(text);

        writer.WriteEndDocument();
    }

    Debug.WriteLine(result.ToString());
}
以及输出:


第1行
第2行
第3行
第1行
第2行
第3行
[TestMethod]
public void WriteIndentedText()
{
    var result = new StringBuilder();
    using (var writer = new IndentTextXmlWriter(new StringWriter(result)){Formatting = Formatting.Indented, IndentText = true})
    {
        string text = @" Line 1
Line 2
    Line 3  ";
        // some root
        writer.WriteStartDocument();
        writer.WriteStartElement("root");
        writer.WriteStartElement("child");

        // test auto-indenting
        writer.WriteStartElement("elementIndented");
        writer.WriteString(text);
        writer.WriteEndElement();

        // test space preserving
        writer.WriteStartElement("elementPreserved");
        writer.WriteAttributeString("xml", "space", null, "preserve");
        writer.WriteString(text);

        writer.WriteEndDocument();
    }

    Debug.WriteLine(result.ToString());
}