我正在尝试将xml反序列化为类,但它给了我一个例外。
我的班级是这样的:
public class FieldsVO
{
public bool AllowPrint { get; set; }
public bool AllowAbort { get; set; }
public bool AllowPrintFSFSDA { get; set; }
}
我的XML:
<fields>
<AllowPrint>True</AllowPrint>
<AllowAbort>True</AllowAbort>
<AllowPrintFSFSDA>True</AllowPrintFSFSDA>
</fields>
反序列化的唯一方法是属性是“字符串”。 有没有办法用anotations做什么?
这是反序列化代码:
public static object Deserialize(string xml, Type objType)
{
if (false == xml.StartsWith("<"))
{
int pos = xml.IndexOf('<');
xml = xml.Remove(0, pos);
}
XmlSerializer serializer = new XmlSerializer(objType);
XmlReaderSettings set = new XmlReaderSettings();
set.ValidationFlags = XmlSchemaValidationFlags.AllowXmlAttributes;
using (XmlReader reader = XmlReader.Create(new StringReader(xml), set))
return serializer.Deserialize(reader);
}
答案 0 :(得分:2)
如果要解析XML,则应使用XSD Schema。
XSD Schema描述了一个XML文件。
添加此文件: 创建一个元素 - &gt; XML Schema。 将此文件称为fields.xsd。
在您的情况下,它将是:
<xs:element name="fields">
<xs:complexType>
<xs:sequence>
<xs:element name="AllowPrint" type="xs:boolean"/>
<xs:element name="AllowAbort" type="xs:boolean"/>
<xs:element name="AllowPrintFSFSDA" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
然后,打开命令行界面。转到fields.xsd所在的目录。 输入:
xsd fields.xsd /classes
现在生成fields.cs。
在XML文件中,您必须添加: - XSD架构的命名空间 - XSD架构的位置
xmlns="urn:fields"
xsi:schemaLocation="urn:fields fields.xsd">