自定义XML序列化和处理CDATA

问题描述 投票:0回答:1

我有一个自定义XML Serializer如下

    public void WriteXml(XmlWriter writer)
    {
        foreach (PropertyInfo pi in this.GetType().GetProperties())
        {
            if (pi.GetCustomAttributes(typeof(XmlIgnoreAttribute), true).Count() == 0)
            {
                var attrList = pi.GetCustomAttributes(typeof(XmlElementAttribute), true);

                if (attrList.Count() > 0)
                {
                    XmlElementAttribute xe = (XmlElementAttribute)attrList[0];
                    writer.WriteStartElement(xe.ElementName);
                }
                else
                {
                    writer.WriteStartElement(pi.Name);
                }

                if (pi.PropertyType == typeof(int) || (pi.PropertyType == typeof(float)))
                {
                    writer.WriteString(pi.GetValue(this, null).ToString());
                }
                else if (pi.PropertyType == typeof(DateTime))
                {
                    DateTime dt = (DateTime)(pi.GetValue(this, null));

                    writer.WriteString(dt.ToString("yyyyMMddHHmm"));
                }
                else
                {

                    if (pi.GetValue(this, null) == null) writer.WriteString(String.Empty);
                    else
                    {
                        // write code to generate CDATA 

                        String val = pi.GetValue(this, null).ToString();

                        if (val.IndexOfAny(invalidChars) != -1)
                            writer.WriteString(String.Format(@"<![CDATA[{0}]]>", pi.GetValue(this, null).ToString()));
                        else writer.WriteString(pi.GetValue(this, null).ToString());
                    }

                }

                writer.WriteEndElement();
            }


        }
    }
}

}

当值包含XML值中无效的一个字符时,会出现问题。使用这些行成功检测到这一点

                    if (val.IndexOfAny(invalidChars) != -1)
                        writer.WriteString(String.Format(@"<![CDATA[{0}]]>", pi.GetValue(this, null).ToString()));
                    else writer.WriteString(pi.GetValue(this, null).ToString());

问题是CDATA的创建 - 而不是获得格式正确的CDATA,我得到的是&gt;和&lt;

那么如何在自定义序列化器中创建格式正确的CDATA?

c# xml cdata serializer
1个回答
0
投票

答案由Jeroen Mostert在评论中提供。

替换以下代码

if (val.IndexOfAny(invalidChars) != -1) writer.WriteString(String.Format(@"<![CDATA[{0}]]>", pi.GetValue(this, null).ToString()));
else writer.WriteString(pi.GetValue(this, null).ToString());

if (val.IndexOfAny(invalidChars) != -1) writer.WriteRaw(String.Format(@"<![CDATA[{0}]]>", pi.GetValue(this, null).ToString()));
else writer.WriteString(pi.GetValue(this, null).ToString());

然后将CDATA正确写入流中并以正确的格式保存到磁盘。

WriteString已被WriteRaw取代。

© www.soinside.com 2019 - 2024. All rights reserved.