2011-09-27 106 views
1

我无法通过代码验证使用XSD的XML。我想不出什么我失踪 XML:无法针对xsd验证xml。错误“cvc-elt.1:找不到元素'系统'的声明”

<?xml version="1.0" encoding="UTF-8"?> 
<systems xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns="test.namespace"> 
    <system address="test" id="test" name="test" systemNr="test"> 
    <mandant mandant="test"/> 
    </system> 
    <system address="test2" name="test2" systemNr="test2" id="test2"> 
    <mandant mandant="test2"/> 
    <mandant mandant="test2"/> 
    </system> 
    <system id="test3" address="test3" name="test3" systemNr="test3"> 
    <mandant mandant="test"/> 
    </system> 
</systems> 

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="test.namespace"> 
    <xs:element name="systems"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="system" maxOccurs="unbounded" minOccurs="1"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="mandant" 
       maxOccurs="unbounded" minOccurs="1"> 
       <xs:complexType> 
        <xs:attribute name="mandant" 
        type="xs:string" use="required"> 
        </xs:attribute> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute name="id" type="xs:string" use="required"> 
      </xs:attribute> 
      <xs:attribute name="name" type="xs:string" use="required"> 
      </xs:attribute> 
      <xs:attribute name="address" type="xs:string" use="required"> 
      </xs:attribute> 
      <xs:attribute name="systemNr" 
       type="xs:string" use="required"> 
      </xs:attribute> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

这里是代码片段:

 File systemsFile = new File(LocalFileSystemManager.getDefaultPath() + "Systems.xml"); 
     File schemaFile = new File(LocalFileSystemManager.getDefaultPath() + "SystemsSchema.xsd"); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document systemsDocument = db.parse(systemsFile); 
     systemsDocument.getDocumentElement().normalize(); 
SchemaFactory factory = SchemaFactory 
     .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema = factory.newSchema(schemaFile); 
     Validator validator = schema.newValidator(); 
     validator.validate(new DOMSource(systemsDocument)); 

提前感谢! Lori

+0

可能与命名空间有关吗? –

+0

抱歉,看起来我没有从XSD Document中复制架构定义标记。它是:<?xml version =“1.0”encoding =“UTF-8”?> Lori

回答

1

这个实例应该被验证。你的属性属于该模式,所以你需要将它们标记为这样一个命名空间:

<?xml version="1.0" encoding="UTF-8"?> 
<systems xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="test.namespace"> 
    <system a:address="test" a:id="test" a:name="test" a:systemNr="test" xmlns:a="test.namespace"> 
     <mandant a:mandant="test"/> 
    </system> 
    ... 
</systems> 

我假设你有attributeFormDefault="qualified"elementFormDefault="qualified"<schema />元素?

+0

试过了,不起作用。我认为它与系统标记有关,因为我的错误是“cvc-elt.1:找不到元素'系统'的声明”。我的schema元素中有elementFormDefault =“qualified”。我已经发布了与这个元素上面的评论,出于某种原因,它没有在我的帖子apear。 – Lori

+0

修复了这个问题。你的实例是完全有效的,所以我的问题必须在你的代码中。 –

+1

你是对的问题是在validator.validate(新的DOMSource(systemsDocument));与validator.validate(新的StreamSource(systemsFile));有用。太感谢了。 – Lori

相关问题