【问题标题】:format string to XML to include tabs, line breaks etc将字符串格式化为 XML 以包括制表符、换行符等
【发布时间】:2012-02-11 02:47:09
【问题描述】:

我正在将多行文本框中的字符串序列化为 XML。是否发送换行符和制表符以保存在 XML 中,所以当我反序列化它时,我让它看起来一样?

示例 - 文本框将如下所示:

Hello JohnDoe,

     This is a message
...
Somelines....

Thank you,
...
End

当我序列化它然后反序列化它时,文本框会像这样填充:

Hello JohnDoe,This is a message..Some lines....Thank you,...End

它不必非常漂亮,我只是想想出一个好方法来让它以更好的格式恢复。谢谢。

好的,我的代码如下:

public void SerializeToXML(List<Report> newReport)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<Report>));

            //XmlWriterSettings serializer_settings = new XmlWriterSettings();
            //serializer_settings.Indent = true;
            //serializer_settings.NewLineOnAttributes = true;

            TextWriter textWriter = new StreamWriter(xmlPath);
            serializer.Serialize(textWriter, newReport);
            textWriter.Close();
        }

Report 只是一个带有一些字符串属性的类。注释行是我试图实现的目标。

报告类代码:

public class Report
    {
        public string name
        { get; set; }

        public string email
        { get; set; }

        public string defectID
        { get; set; }

        public string fixedBuild
        { get; set; }

        public string description
        { get; set; }

        [XmlIgnore]
        public string messageBody
        { get; set; }

     private static readonly XmlDocument _xmlDoc = new XmlDocument();

     [XmlElement("messageBody")]
     public XmlCDataSection TextCData
     {
         get
         {
             return _xmlDoc.CreateCDataSection(messageBody);
         }
         set
         {
             messageBody = value.Data;
         }
     }
    }

输出保持不变(无空格格式)。

【问题讨论】:

    标签: c# string xml-serialization


    【解决方案1】:

    在 XML 中保留所有空格的一种方法是使用 CDATA 部分。详细信息取决于您进行序列化的方式。有关 Web 服务上下文中的说明,请参阅 this question。如果手动序列化,使用XmlWriter.WriteCData方法。

    【讨论】:

    • 嗯,好吧,我已经编辑了我的课程以使用 CDATA 格式。输出没有变化。有什么想法吗?
    • 我还认为问题可能源于我将 XML 反序列化为 LIST,然后是文本框(因为 XML 中有多个报告。但查看XML 文件本身(在反序列化之前,我看到格式仍然被省略)。
    • @ikathegreat 如果没有出现 CDATA 部分,则您所做的更改不正确。尝试编写一个小型的自包含测试项目,将单个元素写入 XML,其中包含 CDATA 部分。有关如何操作的更多信息,请参阅this question。先尝试第二个(不被接受)的答案,如果不起作用,再尝试接受的答案。
    【解决方案2】:

    这个article 似乎提供了一个有效的解决方案。另请查看此答案here

    没有看到你的代码很难给出好的建议。

    编辑

    您可以添加它manually

    或者你也许可以用这样的东西(未经测试,从这个question修改):

    public class Report
    {
        [XmlAttribute("xml:space")]
        public string spacing = "preserve";
    }
    

    这样它应该在序列化过程中自动添加。但是,如果您能找到一种方法来设置不基于字段或属性的 XmlAttribute,那就更好了。

    【讨论】:

    • 为了保留空白,其中一篇文章建议xml:space="preserve"。我不确定它的去向或如何在 XML 中获取它......?在序列化期间?
    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2010-11-10
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多