XML模式验证问题

时间:2013-10-21 14:47:24

标签: java xml xsd xml-validation

我正在尝试验证我之前写过的XML XSD Schema文件。验证我的xml文件的java代码如下所示。当我尝试验证XML时,我总是会收到如下错误:“无法找到根元素的声明”。

你能帮我解决这个问题吗?

XML文件

<?xml version="1.0" encoding="UTF-8"?>
<AllBooks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://myNameSpace.com"  
        schemaLocation="http://myNameSpace.com book.xsd">
    <book>
        <id>1</id>
        <title>aşk ve gurur</title>
        <author>james brown</author>
        <category>science</category>
        <availablity>100</availablity>
        <price>5000</price>
    </book>
    <book>
        <id>2</id>
        <title>kskkdn</title>
        <author>mşlfke</author>
        <category>love</category>
        <availablity>50</availablity>
        <price>5000</price>
    </book>
</AllBooks>

架构文件

<?xml version="1.0" encoding="utf-8"?>
<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="AllBooks">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="book" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="id" type="xs:integer"/>
                            <xs:element name="title" type="xs:string"/>
                            <xs:element name="author" type="xs:string"/>
                            <xs:element name="category" type="xs:string"/>
                            <xs:element name="availability" type="xs:integer"/>
                            <xs:element name="price" type="xs:integer"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

和java代码

static boolean validateAgainstXSD(InputStream xml, InputStream xsd)
{
    try
    {
        SchemaFactory factory = 
        SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = factory.newSchema(new StreamSource(xsd));
        Validator validator = schema.newValidator();
        validator.validate(new StreamSource(xml));
        return true;
    }
    catch(Exception ex)
    {
        return false;
    }
}

1 个答案:

答案 0 :(得分:1)

您的命名空间在XSD和XML文件之间不匹配。此外,availability拼写错误为XML文件中的availablity。更正如下......

使用此XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="http://myNameSpace.com"
           elementFormDefault="qualified">

  <xs:element name="AllBooks">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="book" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="id" type="xs:integer"/>
              <xs:element name="title" type="xs:string"/>
              <xs:element name="author" type="xs:string"/>
              <xs:element name="category" type="xs:string"/>
              <xs:element name="availability" type="xs:integer"/>
              <xs:element name="price" type="xs:integer"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

然后,此固定的XML实例文档将有效:

<?xml version="1.0" encoding="UTF-8"?>
<AllBooks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://myNameSpace.com"  
             xsi:schemaLocation="http://myNameSpace.com book.xsd">
    <book>
        <id>1</id>
        <title>aşk ve gurur</title>
        <author>james brown</author>
        <category>science</category>
        <availability>100</availability>
        <price>5000</price>
      </book>
    <book>
        <id>2</id>
        <title>kskkdn</title>
        <author>mşlfke</author>
        <category>love</category>
        <availability>50</availability>
        <price>5000</price>
    </book>
</AllBooks>