2012-05-04 18 views
6

Tôi tạo ra XSD sau (với Eclipse):Lỗi xác thực XSD: Phần tử '{http://www.example.com} Phạm vi': Phần tử này không được mong đợi. Dự kiến ​​là (Scope)

<?xml version="1.0" encoding="UTF-8"?> 
    <schema targetNamespace="http://www.example.com" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.com"> 
    <element name="Make"> 
     <complexType> 
     <sequence> 
      <element name="Scope"></element> 
     </sequence> 
     </complexType> 
    </element> 
    </schema> 

và xác nhận với XML này đơn giản

<?xml version="1.0"?> 
    <Make xmlns="http://www.example.com"> 
    <Scope> 
    </Scope> 
    </Make> 

cho:

xmllint.exe --noout --schema sources.xsd sources.xml 
    sources.xml:3: element Scope: Schemas validity error : Element '{http://www.example.com}Scope': This element is not expected. Expected is (Scope). 
    sources.xml fails to validate 

Theo tôi, Điều này phải là chính xác: tệp XML nằm trong không gian tên http://www.example.com (điều gì cũng là trình xác thực cho biết) .

Và đối với XSD, tôi đặt không gian tên mặc định thành lược đồ XSD (đây là những gì Eclipse làm, vì vậy nó phải chính xác!) Và tôi cung cấp cho targetNamespace chính xác. Tôi cũng đã cố gắng sử dụng

<element name="tnd:Scope" /> 

Tuy nhiên, điều này cũng không có tác dụng.

Đây có phải là lỗi trong xmllint hoặc vấn đề ở đâu?

Trân divB

+0

Typo? 'tnd: Scope' sẽ là' tns: Scope' – Filburt

Trả lời

3

Một thay thế cho @dbasemans trả lời sẽ là để xác định elementFormDefault như có trình độ:

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

Sử dụng xsd hoặc Tiền tố xs cho không gian tên lược đồ của bạn có thể được coi là phổ biến, vì vậy có thể muốn chọn sửa đổi giản đồ của bạn được đề xuất bởi dbaseman.

+0

Xin chào, cảm ơn (đối với cả hai bạn)! Một điều tôi không hiểu sau đó: Đối với những gì tôi cần targetNamespace sau đó? – divB

+0

Thực ra, câu trả lời của bạn là chính xác (+1) trái ngược với câu trả lời khác, điều đó sai. Tuy nhiên, nhiều người cho rằng 'xsd' có thể được coi là tiền tố chuẩn - tôi sẽ sử dụng" phổ biến "thay thế. Thực tế, 'xs' là cái được định nghĩa trong [DTD] (http://www.w3.org/2001/XMLSchema.dtd) thường đi kèm với XSD cho XSD ... –

+1

@divB Bạn vẫn cần ** targetNamespace ** trừ khi bạn muốn ẩn (bản địa hoá) vùng tên * http: //www.example.com* trong tài liệu cá thể. – McGarnagle

2

Bạn phải đặt cả targetNamespace và không gian tên XSD gốc với giá trị tương tự, nếu bạn không muốn để xác định bất kỳ vòng loại trong file XML để được xác nhận. Vì vậy, nó sẽ phải là:

<schema targetNamespace="http://www.example.com" xmlns="http://www.example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

Nhưng sau đó tất nhiên, bạn phải đủ điều kiện các yếu tố XSD với xsd :. Nói cách khác, để có tập tin xác thực XML của bạn như là, bạn cần phải viết giản đồ như thế này:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="http://www.example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.com"> 
    <xsd:element name="Make"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="Scope"></xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

Xem ở đây để biết thêm: http://www.xfront.com/DefaultNamespace.pdf

EDIT Cảm ơn PetruGardea vì đã chỉ ra lỗi. Như câu trả lời của Filbert ngụ ý, elementFormDefaultkhông đủ tiêu chuẩn theo mặc định, có nghĩa là tài liệu thể hiện được giả định là trong không gian tên đích. Vì vậy, câu trả lời của Filbert là đúng - thay thế duy nhất là làm cho toàn bộ điều ẩn danh, bằng cách bỏ qua targetNamespace và để lại elementFormDefaultunqualified rồi loại bỏ tham chiếu không gian tên hoàn toàn khỏi tài liệu thể hiện.

Dưới đây là một phân tích tốt về những gì elementFormDefault làm: http://www.xfront.com/HideVersusExpose.html

+0

Thật không may, câu trả lời của bạn không liên quan gì đến câu hỏi; không có vấn đề gì với XSD, và những gì bạn đang đề xuất không thay đổi lược đồ theo bất kỳ cách nào; XSD đã cập nhật của bạn không thay đổi kết quả của việc xác thực XML được đề xuất. –

1

Tôi đã tìm thấy một giải pháp khác cho vấn đề này, nếu bạn không thể hoặc không muốn thay đổi XSD. XML sau đây phù hợp với XSD của bạn:

<?xml version="1.0"?> 
<tns:Make xmlns:tns="http://www.example.com"> 
    <Scope> 
    </Scope> 
</tns:Make> 

Nếu elementFormDefault được thiết lập để không đủ tiêu chuẩn, bạn phải xác định không gian tên cho các yếu tố toàn cầu và bạn không phải xác định không gian tên cho các yếu tố địa phương. Các phần tử toàn cục là các phần tử trực tiếp bên dưới phần tử lược đồ trong XSD và các phần tử cục bộ là các phần tử lồng nhau trong các phần tử khác. Lỗi của bạn là do xác định không gian tên cho phần tử cục bộ Phạm vi bằng cách sử dụng một không gian tên mặc định.

Có giải thích thêm tại http://www.oracle.com/technetwork/articles/srivastava-namespaces-092580.html.

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