C#如何反序列化文本中嵌入的xml标签?

时间:2013-06-13 15:52:35

标签: c# xmlserializer xml-documentation

我正在尝试使用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)。 ----&GT; System.Xml.XmlException:意外的节点类型   元件。 ReadElementString方法只能在元素上调用   简单或空洞的内容。第147行,第27位。

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

1 个答案:

答案 0 :(得分:0)

cref标签本身包含非法字符。具体而言&lt;,&gt;不能嵌入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);
    }

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

Invalid Characters in XML