1

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

反序列化工作的唯一方法是属性是“字符串”。有没有办法用注释或其他东西来做到这一点?

下面是反序列化代码:

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);
        }
4

1 回答 1

2

当你想解析 XML 时,你应该使用 XSD Schema。

XSD Schema 描述了一个 XML 文件。

要添加此文件:创建一个元素 -> 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">
于 2013-07-04T12:32:51.393 回答