我正在尝试使用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位。
如何在反序列化期间将摘要标记的全部内容捕获为字符串?
答案 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);
}
您也可以使用此处的一些方法,使用正则表达式删除任何非法字符: