Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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#_Xmlserializer_Xml Documentation - Fatal编程技术网

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

C# 如何反序列化嵌入在文本中的xml标记?,c#,xmlserializer,xml-documentation,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:MyNames

我正在尝试使用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>

Apt.Lib.Data.Product
有关更多信息,请参阅
...
我用来生成序列化程序的对象是:

    [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; }
        }
}
[XmlRoot(“doc”)]
公共类XML文档
{
公共静态只读XmlSerializer Serializer=新XmlSerializer(typeof(XmlDocumentation));
[XmlElement(“组件”)]
公共AssemblyName程序集{get;set;}
[XmlArray(“成员”)]
[XmlArrayItem(“成员”)]
公共列表成员{get;set;}
公共类AssemblyName
{
[XmlElement(“名称”)]
公共字符串名称{get;set;}
}
公共班级成员
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[XmlElement(“摘要”)]
公共字符串摘要{get;set;}
}
}
问题是序列化程序遇到嵌入的see-cref标记时。在这种情况下,序列化程序引发以下异常:

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


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

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);
    }
string ScrubString(字符串脏)
{
char[]charArray=dirty.ToCharArray();
StringBuilder strBldr=新的StringBuilder(dirty.Length);
for(int i=0;i|| (charInt>=32&&charInt=9983&&charInt=57344&&charInt=65536&&charInt
Summary
类的定义是什么?@cdhowie:正如我所说,Summary只是字符串类型的属性。它不是一个类。我可以读取,我发誓。问题似乎是序列化程序没有正确地转义特殊的XML字符@cdhowie:在这种情况下,我正在反序列化由C#编译器生成的xml,因此我对生成的内容没有任何控制权。我只想设置反序列化程序,使其在给定内容的情况下工作。我认为类无法以XmlSerializer能够理解的方式对此进行精确建模。您将文本与元素混合在一起,这不是XmlSerializer真正为之构建的情况。那么,你是说没有办法使用XmlSerializer对C#的文档注释生成的XML文件进行反序列化吗?我想我不太清楚cref标记首先是如何在摘要中结束的。这是你手动添加到方法摘要中的吗?有一个l注意,看起来您可以将cref用作属性而不是元素。@Ringer cref属性是有效的;它允许您将一些文本链接到其他文档。@cdhowie是的,cref属性是有效的,但看起来他在摘要的正文中有一个完整的cref标记,而不是将其作为摘要标记上的属性。这很简单呃,告诉我们是否可以看到生成它的源文件。@Ringer问题不在于未转义的字符——它们不应该转义——而是这个文档结构不是XmlSerializer设计用来处理的。