当前位置 : 主页 > 网页制作 > xml >

使用XSD验证XmlDocument

来源:互联网 收集:自由互联 发布时间:2021-06-13
我正在开发一个系统,它将通过webservice接收 XML(XmlDocument).我不会在硬盘上有这个XML(XmlDocument).它将在内存上进行管理. 我有一个文件XSD来验证我从WebService收到的XML(XmlDocument).我试图做一个
我正在开发一个系统,它将通过webservice接收 XML(XmlDocument).我不会在硬盘上有这个XML(XmlDocument).它将在内存上进行管理.

我有一个文件XSD来验证我从WebService收到的XML(XmlDocument).我试图做一个例子来验证这个Xml.

我的XML:

<?xml version="1.0"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

我也有我的XSD:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
  <xs:element name="note">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="to" type="xs:string"/>
        <xs:element name="from" type="xs:string"/>
        <xs:element name="heading" type="xs:string"/>
        <xs:element name="body" type="xs:int"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

正如我们所看到的,我将身体字段设为int,只是为了模拟错误.

好吧,为了尝试获取错误,我有以下代码:

//event handler to manage the errors
private static void verifyErrors(object sender, ValidationEventArgs args)
{
    if (args.Severity == XmlSeverityType.Warning)
        MessageBox.Show(args.Message);
}

点击按钮,我有:

private void button1_Click(object sender, EventArgs e)
        {

            try
            {
                // my XmlDocument (in this case I will load from hardisk)
                XmlDocument xml = new XmlDocument();
                // load the XSD schema.. is this right?
                xml.Schemas.Add("http://www.w3schools.com", "meuEsquema.xsd");

                // Load my XML from hardisk
                xml.Load("meusDados.xml");

                // event handler to manage the errors from XmlDocument object
                ValidationEventHandler veh = new ValidationEventHandler(verificaErros);

                // try to validate my XML.. and the event handler verifyError will show the error
                xml.Validate(veh);
            }
            catch {
              // do nothing.. just to test
            }
        }

问题是我将body字段更改为int,但是该字段中有一个字符串值,我没有收到错误.

问题是XML命名空间.

在您的XSD中,您将targetNamespace =和xmlns =定义为“http://www.w3schools.com”:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns="http://www.w3schools.com"
           elementFormDefault="qualified">

但是 – 您的XML文档不包含任何XML名称空间.

<?xml version="1.0"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

基本上,XSD根本没有验证这个XML.

您需要从XSD中删除这些命名空间:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">

或者,将XSD中定义的默认XML命名空间(没有前缀)添加到XML:

<?xml version="1.0"?>
<note xmlns="http://www.w3schools.com">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

如果您的XSD中有XML命名空间,那么它们也必须存在于XML中 – 反之亦然.

一旦你做了一个或另一个解决方案,你应该得到一个验证错误,如:

Validation error: The 'body' element is invalid - The value 'Don't forget me this weekend!' is invalid according to its datatype
'http://www.w3.org/2001/XMLSchema:int' - The string 'Don't forget me this weekend!' is not a valid Int32 value.
网友评论