要验证的XML数据集

时间:2013-11-07 07:16:24

标签: c# xml xsd

大家好,我有一个场景,我有

两个XML文件

一个xml说“Books.xml”将为DATASET创建架构,我将使用其他XML文件将数据加载到DATASET中,第二个文件中的所有数据都将插入DATASET

我已经做了这些事情,但我坚持验证XML我想验证第二个xml文件 表示根据DATASET模式输入到数据集中的数据应完全有效,该模式将根据First XML

我已经尝试过使用XSD,但我不确定XSD是否能够验证数据类型,如果我必须输入数字并且我的xml中有一个字符串,它应该抛出异常

我有像这样的xml

<DATA>
  <HISTORY>
    <book1>SOmebook</book1>
  </HISTORY>
  <POETRY>
    <book2>Books</book2>
  </POETRY>
 </DATA>

我正在使用VisualStudio生成我的XSD

使用类似这样的方法验证它

XmlReaderSettings settings = //dont know exact settings
               string data = null;
               XmlReader Reader = XmlReader.Create(File.Open("C:\books.XML", FileMode.Open), settings, data);

            DataSet ds = new DataSet();
            ds.ReadXml(Reader); 

1 个答案:

答案 0 :(得分:0)

以下是有关如何使用架构进行验证的快速示例。我正在使用W3Schools中的shiporder示例。

架构:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
   <xs:attribute name="orderid" type="xs:string" use="required"/>
 </xs:complexType>
</xs:element>

</xs:schema>

XML:

<?xml version="1.0" encoding="ISO-8859-1"?>

<shiporder orderid="889923">
  <orderperson>John Smith</orderperson>
    <shipto>
      <name>Ola Nordmann</name>
      <address>Langgt 23</address>
      <city>4000 Stavanger</city>
      <country>Norway</country>
   </shipto>
   <item>
     <title>Empire Burlesque</title>
     <note>Special Edition</note>
     <quantity>1</quantity>
     <price>10.90</price>
   </item>
   <item>
    <title>Hide your heart</title>
    <quantity>1</quantity> <!--Change to "one" to see validation error-->
    <price>9.90</price>
  </item>
</shiporder>

这是使用Linq2XML的验证:

XDocument document = XDocument.Load("shiporder.xml");
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create("schema.xsd"));
bool errors = false;

document.Validate(schemas, (o, e) =>
    {
        Console.WriteLine("Validation error: {0}", e.Message);
        errors = true;
    });

    if (!errors)
    {
        Console.WriteLine("XML document successfully validated.");
    }
    else 
    {
        Console.WriteLine("XML document does not validate.");
    }

更改注释中提到的<quantity>节点的值,以查看XML因类型无效而无法验证的方式。