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