【问题标题】:XML DATASET to be Validated要验证的 XML 数据集
【发布时间】:2013-11-07 16:17:05
【问题描述】:

大家好,我有一个场景

两个 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); 

【问题讨论】:

  • XML 模式 确实 验证简单类型​​,例如 xs:stringxs:decimalxs:integerxs:boolean、'xs:date, xs:time@ 987654330@Validate()` 方法可让您指定架构。如果验证失败,您就知道您的 XML 无效。自定义对象类型并不容易验证。对我来说,创建自定义验证器似乎有点极端。
  • oki 感谢您抽出时间,andrei,但您能告诉我如何使用 linq2xml 验证,因为我在 xml 中是 = null 事情刚刚开始
  • 看看这个link。它显示了一个简单的示例,用于根据 Schema 验证 XDocument 以及如何处理错误。在这个例子中,Schema 是硬编码的,但从文件中加载它并不难。查看XDocument class 了解更多信息。关于如何使用这个类有很多例子。希望这会有所帮助。
  • 再看看你的 XML,我必须问一下 &lt;book1&gt;&lt;book2&gt; 标记是否故意创建不同。您想明确区分历史书籍和诗歌书籍吗?如果是这样,我会建议更有意义的名称(例如&lt;poetrybook&gt;)。如果没有,您可能希望使用“通用”&lt;book&gt;
  • 这只是一个虚拟 xml 原始 xml 与此有很大不同,我已经通过您的帮助实现了我想要的,并且在下面的代码中进行了一些更改以满足我的需求,非常非常

标签: c# xml xsd


【解决方案1】:

这是一个关于如何使用架构进行验证的快速示例。我正在使用来自W3Schoolsshiporder 示例。

架构:

<?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.");
    }

更改注释中提到的 &lt;quantity&gt; 节点的值,以查看 XML 如何因无效类型而无法验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2015-04-09
    • 2013-09-15
    • 1970-01-01
    相关资源
    最近更新 更多