元素“Root”的名称空间必须来自模式名称空间“http://www.w3.org/2001/XMLSchema”?

时间:2011-02-07 14:33:44

标签: xml validation xsd saxparseexception

我有一个xml文档:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Child name="MyType" compareMode="EQ"></Child>
</Root>

我想借助以下xsd验证这个xml:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Child">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="required" />
            <xs:attribute name="compareMode" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

当我尝试验证它时,我收到以下错误:

Exception in thread "main" org.xml.sax.SAXException: Validation failed against correct.xml. ErrorMessage:s4s-elt-schema-ns: The namespace of element 'Root' must be from the schema namespace, 'http://www.w3.org/2001/XMLSchema'.

我的问题是为什么 Root 必须位于架构的名称空间中?可能是因为我没有正确验证xml文档吗?

  

public synchronized boolean isValid(String xmlFragment,File xmlSchema)抛出SAXException,IOException {

     

// 1.查找W3C XML Schema语言的工厂

SchemaFactory factory = 
    SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

// 2. Compile the schema. 

Schema schema = factory.newSchema(xmlSchema);

// 3. Get a validator from the schema.
Validator validator = schema.newValidator();

// 4. Parse the document you want to check.
Source source = new StreamSource(new ByteArrayInputStream(xmlFragment.getBytes()));

// 5. Check the document    
    validator.validate(source);        
    return true;
}

2 个答案:

答案 0 :(得分:4)

是不是xmlSchema不支持你向我们展示的架构,而是由W3C发布的“架构文档架构”?错误消息片段“ErrorMessage:s4s-elt-schema-ns:”似乎暗示了这一点。

答案 1 :(得分:0)

该文档在定义的模式下有效,因此它必须是代码。

SchemaFactory.newInstance调用中,对所需命名空间的唯一显式引用(在错误消息中指定)。如果在那里传递空(“”)命名空间会发生什么?

此外,在架构中的XML文档中显式设置预期的命名空间是一种很好的方式。有几种方法可以做到这一点。由于您选择为XMLSchema命名空间添加前缀,因此我建议您将xmlns="" targetNamespace=""添加到<xs:schema标记中。