2011-10-19 26 views
5

Tôi có một XML Schema trong đó có một sốXML Validation trong Java: processContents = "lỏng lẻo" dường như không làm việc một cách chính xác

<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> 

định nghĩa, ví dụ, nó cho phép để chèn thẻ tùy ý các không gian tên khác. processContents="lax" cho biết rằng trình phân tích cú pháp nên thử xác thực các thẻ này, nếu nó có lược đồ theo sau (1)(2). Đối với tôi điều này có nghĩa là nếu tôi cung cấp cho trình phân tích cú pháp tất cả các tài liệu lược đồ và có một thẻ XML không hợp lệ của một trong các không gian tên phụ, nó cần báo cáo lỗi.

Tuy nhiên, có vẻ như trình xác thực Java XML bỏ qua các lỗi như vậy. Tôi đã xác minh rằng trình phân tích cú pháp có tất cả các tài liệu lược đồ cần thiết để thực hiện xác thực (nếu tôi thay đổi lược đồ XML thành processContents="strict", nó hoạt động như mong đợi và sử dụng các tài liệu lược đồ thứ cấp để xác thực). Dường như đối với trình xác thực hoạt động như thể thuộc tính được chỉ định với giá trị skip.

mã Java để xác thực:

/* 
* xmlDokument is the file name of the XML document 
* xsdSchema is an array with all schema documents 
*/ 
public static void validate(String xmlDokument, Source[] xsdSchema) throws SAXException, IOException { 
    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema schema = schemaFactory.newSchema(xsdSchema); 
    Validator validator = schema.newValidator(); 
    validator.setErrorHandler(new MyErrorHandler()); 
    validator.validate(new StreamSource(new File(xmlDokument))); 
} 

Minimal dụ:

Giản đồ chính:

<xs:schema 
    xmlns="baseNamespace" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="baseNamespace" 
    xmlns:tns="baseNamespace"> 

<!-- Define single tag "baseTag" --> 
<xs:element name="baseTag"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

Giản đồ thứ:

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

<xs:element name="additionalTag"/> 

</xs:schema> 

Các tài liệu XML Tôi cố gắng để xác nhận:

<baseTag 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="baseNamespace" 
    xmlns:secondary="secondaryNamespace" 
    xsi:schemaLocation=" 
    baseNamespace base.xsd 
    secondaryNamespace secondary.xsd"> 

    <secondary:additionalTag/> 
    <secondary:invalidTag/> 
</baseTag> 

Sử dụng mã Java trên cho cả hai tài liệu giản đồ không tạo ra bất kỳ lỗi xác nhận, chỉ khi tôi thay đổi lax để strict tại các cơ sở lược đồ (mà tôi không muốn). Các thông báo lỗi trong trường hợp này là

cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'secondary:invalidTag'. 

Câu hỏi:

đã làm tôi hiểu sai điều gì đó và điều này thực sự là hành vi có đúng không? Hay tôi có quyền liên quan đến processContents?

Tài liệu giản đồ của tôi có làm đúng không?

Mã Java của tôi có đúng không? Làm thế nào tôi có thể thay đổi nó để nó hoạt động như mong đợi?

Trả lời

6

Theo spec: "Nó sẽ xác nhận các yếu tố và các thuộc tính mà nó có thể có được thông tin lược đồ, nhưng nó sẽ không báo hiệu lỗi cho những nó không thể lấy bất cứ thông tin schema"

Vì vậy, khi bạn sử dụng procesContents "lax", trình xác thực không thể tìm thấy lược đồ cho "invalidTag" và do đó bỏ qua nó, theo thông số kỹ thuật.

+1

Nhưng không nên nó xác nhận không gian tên 'phụ', mà nó * có * một lược đồ, và thấy rằng' invalidTag' không hợp lệ trong không gian tên này? –

+3

Không, nó không dựa trên việc có các định nghĩa lược đồ cho không gian tên hay không, chỉ khi nào có khai báo phần tử cho tên phần tử cụ thể. –

+0

Cảm ơn bạn rất nhiều vì đã sửa lại sự hiểu lầm của tôi. –

Các vấn đề liên quan