为什么XML Deserilzation不应该抛出异常

时间:2010-05-04 03:32:31

标签: c# .net xml xml-serialization

这是我制作的一些虚拟xml和虚拟xml架构。

模式

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.domain.com"
xmlns="http://www.domain.com"
elementFormDefault="qualified">
  <xs:element name="vehicles">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="owner" minOccurs="1" maxOccurs="1">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:minLength value="2" />
              <xs:maxLength value="8" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="Car" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Information" type="CarInfo" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Truck">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Information" type="CarInfo"  minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="SUV">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Information" type="CarInfo" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="CarInfo">
    <xs:sequence>
      <xs:element name="CarName">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="50"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="CarPassword">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:minLength value="6"/>
            <xs:maxLength value="50"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="CarEmail">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:pattern value="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

xml示例

<?xml version="1.0" encoding="utf-8" ?>
<vehicles>
  <owner>Car</owner>
  <Car>
    <Information>
      <CarName>Bob</CarName>
      <CarPassword>123456</CarPassword>
      <CarEmail>Red@test.com</CarEmail>
    </Information>
    <Information>
      <CarName>Bob2</CarName>
      <CarPassword>123456</CarPassword>
      <CarEmail>Red@test.com</CarEmail>
    </Information>
  </Car>
  <Truck>
    <Information>
       <CarName>Jim</CarName>
      <CarPassword>123456</CarPassword>
      <CarEmail>Red@test.com</CarEmail>
    </Information>
    <Information>
      <CarName>Jim2</CarName>
      <CarPassword>123456</CarPassword>
      <CarEmail>Red@test.com</CarEmail>
    </Information>
  </Truck>
  <SUV>
    <Information>
      <CarName>Jane</CarName>
      <CarPassword>123456</CarPassword>
      <CarEmail>Red@test.com</CarEmail>
    </Information>
    <Information>
      <CarName>Jane</CarName>
      <CarPassword>123456</CarPassword>
      <CarEmail>Red@test.com</CarEmail>
    </Information>
  </SUV>
</vehicles>

序列化类

using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;

[XmlRoot("vehicles")]
public class MyClass
{
    public MyClass()
    {
        Cars = new List<Information>();
        Trucks = new List<Information>();
        SUVs = new List<Information>();
    }



    [XmlElement(ElementName = "owner")]
    public string Owner { get; set; }

    [XmlElement("Car")]
    public List<Information> Cars { get; set; }

    [XmlElement("Truck")]
    public List<Information> Trucks { get; set; }

    [XmlElement("SUV")]
    public List<Information> SUVs { get; set; }

}

public class CarInfo
{
    public CarInfo()
    {
        Info = new List<Information>();
    }

    [XmlElement("Information")]
    public List<Information> Info { get; set; }
}

public class Information
{
    [XmlElement(ElementName = "CarName")]
    public string CarName { get; set; }

    [XmlElement("CarPassword")]
    public string CarPassword { get; set; }

    [XmlElement("CarEmail")]
    public string CarEmail { get; set; }
}

现在我认为这应该全部验证。如果不是假设它是写的,因为我的真实文件确实有效,这就是这个虚拟文件的基础。现在我的问题是这个。我想尽可能多地从我的架构中强制执行。例如“owner”标记必须是第一个元素,并且应该只显示一次(minOccurs =“1”maxOccurs =“1”)。

现在我可以从我的虚拟xml文件中删除所有者元素并对其进行deseriliaze它将继续它的快乐方式并将其转换为对象,并将该属性设置为null。我不希望我想要它抛出异常或者说这与预期的匹配。

我不希望在反序列化后验证这样的东西。 <car></car>标签也是如此,即使没有任何信息,我希望它始终显示,我也可以将其删除,并且会对此感到满意。

那么我需要添加哪些标记才能使我的序列化类知道这些内容是必需的,如果找不到它们会引发异常。

2 个答案:

答案 0 :(得分:1)

什么API正在进行[de]序列化?如果这是asmx之类的东西,那么可能没有太多你可以做的(没有实现IXmlSerializable,这很可怕),但如果你可以直接控制XmlReader / {{1创建(例如,从文件或网络套接字),您可以让读者/作者为您进行验证,like so

答案 1 :(得分:0)

我不了解元素,但你绝对可以创建属性“所有者”并使其成为必需元素。并且您可以在所有者属性上使用[XmlAttribute]。