2

我正在尝试使用 XmlSerializer 反序列化 .NET 的 XML 文档注释的输出。作为参考,xml 文档的输出如下所示:

<?xml version="1.0"?>
<doc>
    <assembly>
        <name>Apt.Lib.Data.Product</name>
    </assembly>
    <members>
        <member name="P:MyNamespace.MyType.MyProperty">
            <summary>See <see cref="T:MyNamespace.MyOthertype"/> for more info</summary>
        </member>
        ...
    </members>
</doc>

我用来生成序列化程序的对象是:

    [XmlRoot("doc")]
    public class XmlDocumentation
    {
        public static readonly XmlSerializer Serializer = new XmlSerializer(typeof(XmlDocumentation));

        [XmlElement("assembly")]
        public AssemblyName Assembly { get; set; }
        [XmlArray("members")]
        [XmlArrayItem("member")]
        public List<Member> Members { get; set; }

        public class AssemblyName
        {
            [XmlElement("name")]
            public string Name { get; set; }
        }

        public class Member
        {
            [XmlAttribute("name")]
            public string Name { get; set; }
            [XmlElement("summary")]
            public string Summary { get; set; }
        }
}

问题是当序列化程序遇到嵌入的 see cref 标记时。在这种情况下,序列化程序会抛出以下异常:

System.InvalidOperationException : XML 文档 (147, 27) 中存在错误。----> System.Xml.XmlException:意外的节点类型元素。ReadElementString 方法只能在内容简单或为空的元素上调用。第 147 行,第 27 位。

如何在反序列化期间将摘要标记的全部内容捕获为字符串?

4

1 回答 1

0

cref 标签本身包含非法字符。特别是 <, > 不能嵌入到 XML 元素的内容中。您应该在对字符串进行序列化或反序列化之前对其进行清理。

如果您需要能够对某些字符的转义或替换方式应用特定规则,则可以执行以下操作:

    string ScrubString(string dirty)
    {
        char[] charArray = dirty.ToCharArray();
        StringBuilder strBldr = new StringBuilder(dirty.Length);

        for (int i = 0; i < charArray.Length; i++)
        {
           if(IsXmlSafe(charArray[i]))
           {
              strBldr.Append(charArray[i]);
           }
           else
           {
              //do something to escape or replace that character. 
           }
        }
        retrun strBldr.ToString();
    }


    bool IsXmlSafe(char c)
    {
       int charInt = Convert.ToInt32(c);

       return charInt == 9
           || charInt == 13
           || (charInt >= 32    && charInt <= 9728)
           || (charInt >= 9983  && charInt <= 55295)
           || (charInt >= 57344 && charInt <= 65533)
           || (charInt >= 65536 && charInt <= 1114111);
    }

您还可以使用此处的一些方法来使用正则表达式删除任何非法字符:

XML 中的无效字符

于 2013-06-13T16:39:08.780 回答