2011-08-25 23 views
58

Trong tài liệu lược đồ xml, nếu tôi có cả targetNamespace và xmlns không có tiền tố.targetNamespace và xmlns không có tiền tố, sự khác biệt là gì?

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

Sự khác biệt chính xác giữa chúng là gì? Sự hiểu biết của tôi là nếu bạn có một xmlns không có tiền tố, tất cả các phần tử không có tiền tố sẽ nhận được không gian tên đó và ... gây nhầm lẫn giống như vậy đối với targetNamespace.

+0

tôi có thể thiếu một số kiến ​​thức về chủ đề này, nhưng có thể không phải là câu trả lời chỉ là: xmlns là không gian tên mặc định cho tài liệu này (tài liệu lược đồ), trong khi vùng tên miền targetNamespace là vùng tên mà tài liệu lược đồ này xác nhận? Và theo cách này, xmlns và targetNamespace là hai thứ khác nhau? – Vering

+0

@Việc kiểm tra kết quả thử nghiệm của tôi là phù hợp với câu đầu tiên của bạn có targetNamespace chắc chắn đề cập đến tài liệu mà lược đồ xác nhận. Sự hiện diện của targetNamespace dường như cũng cần sự hiện diện của 'xmlns' hoặc 'xmlns: xxx'. Trong thực tế, bạn có thể kết hợp nhiều 'xmlns: xxx', 'xmlns: yyy' và 'xmlns' với nhau và nó vẫn xác nhận. – ifelsemonkey

Trả lời

67

targetNamespace là một tạo phẩm XML "artifact"; mục đích của nó: để chỉ ra không gian tên XML cụ thể nào mà tệp lược đồ mô tả.

xmlns - vì lược đồ XML là tài liệu XML, sau đó có thể xác định không gian tên XML mặc định cho chính tệp XML (đây là thuộc tính xmlns); các tác động là nhiều: authoring, và composition. Ví dụ: một người không phải sử dụng tiền tố cho các mục được xác định trong giản đồ, sau này được tham chiếu ở nơi khác trong cùng một tệp (ví dụ: một loại đơn giản chung được sử dụng làm loại cho thuộc tính hoặc phần tử).

Từ kinh nghiệm của tôi, nhiều tác giả Lược đồ XML coi đây là một "thực hành tốt nhất" ... vì vậy bạn đang đi đúng hướng.

Về XSD, targetNamespace quy định phần không gian tên của tên đủ điều kiện của một thành phần lược đồ, bao gồm các phần tử, thuộc tính, nhóm và nhóm thuộc tính và các loại đơn giản và phức tạp. Một số tên đủ điều kiện được định nghĩa trong một XSD (các phần tử và các thuộc tính) là "trực tiếp" được sử dụng bởi một tài liệu cá thể XML. Các loại khác, chẳng hạn như đối với các loại, có thể được tham chiếu thông qua thuộc tính xsi:type trong các tài liệu XML ví dụ. Phần còn lại (nhóm, nhóm thuộc tính) có để tạo điều kiện thành phần lược đồ (thông qua tài liệu tham khảo).

Tôi cũng ý kiến ​​đó (nói chung) người đến lúc thiết kế XSD từ hai góc độ:

  • để phù hợp với một XML hiện có. Trong trường hợp này, nếu XML của bạn sử dụng các không gian tên, cho mỗi không gian tên được sử dụng, bạn sẽ kết thúc với một phần tử lược đồ XSD với một thuộc tính targetNamespace phù hợp.

  • làm mẫu thuần túy. Sau đó bạn nghĩ về targetNamespace tương tự như một gói UML, hoặc lược đồ cơ sở dữ liệu, hoặc một gói Java, hoặc một không gian tên .NET, và tất cả nó có nghĩa là trong trường hợp này. Về cơ bản nó là một cơ chế để tránh va chạm đặt tên; tuy nhiên, nó cũng là một cơ chế để phân vùng các mô hình trong lĩnh vực chuyên môn, vv

13

xmlns

Thuộc tính xmlns bộ không gian tên mặc định của phần tử được mô tả. Do đó, không gian tên mặc định được áp dụng cho tất cả các phần tử bên trong phần tử được mô tả, không khai báo rõ ràng một không gian tên khác cho chính chúng.

Không gian tên mặc định được thiết lập để một giá trị tiêu chuẩn cho các tập tin WSDL: http://www.w3.org/ns/wsdl

targetNameSpace

Thuộc tính này chứa các không gian tên của dịch vụ web của bạn. Bạn có thể chọn không gian tên này một cách tự do, nhưng có một quy ước nói rằng URI sẽ trỏ đến WSDL của dịch vụ.

xmlns: tns

không gian tên này nên được thiết lập để cùng URI như thuộc tính targetNameSpace. Bằng cách đó bạn có thể tham khảo không gian tên đích thông qua tiền tố không gian tên này (tns).

Nguồn: http://tutorials.jenkov.com/wsdl/description.html

14

Đối với những người vẫn còn nhầm lẫn, hãy xem xét ba XSD. Tất cả chúng đều định nghĩa một kiểu toàn cục và một định nghĩa phần tử toàn cục tham chiếu nó.

Đầu tiên, một xsd giống như hình đã đăng ở trên. Nó sử dụng tiền tố 'xsd' cho không gian tên lược đồ, và một không gian tên mặc định cho targetNamespace:

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

    <xsd:element name="aGlobalElement" type="aGlobalType"/> 

    <xsd:simpleType name="aGlobalType"> 
    <xsd:restriction base="xsd:string"/> 
    </xsd:simpleType> 
</xsd:schema> 

Bây giờ xsd tương tự, nhưng việc xác định và sử dụng một tiền tố namespace cho namespace mục tiêu:

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

    <xsd:element name="aGlobalElement" type="tns:aGlobalType"/> 

    <xsd:simpleType name="aGlobalType"> 
    <xsd:restriction base="xsd:string"/> 
    </xsd:simpleType> 
</xsd:schema> 

... và cuối cùng, một phiên bản sử dụng một không gian tên mặc định thay vì 'xsd' cho không gian tên lược đồ XML:

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

    <element name="aGlobalElement" type="tns:aGlobalType"/> 

    <simpleType name="aGlobalType"> 
    <restriction base="string"/> 
    </simpleType> 
</schema> 

Hầu hết các tác giả schema chọn đầu tiên hoặc cuối cùng, bởi vì nếu cơ sở không gian tên mặc định có sẵn sau đó chúng tôi cũng có thể sử dụng nó cho một cái gì đó.

-1

Sau khi kiểm tra kỹ lưỡng bằng cách sử dụng xmllint Tôi nghĩ rằng tôi đã tìm thấy lời giải thích rõ ràng tại đây. Hãy xem xét các giản đồ dưới đây:

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema 
version="1.0" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://yyyzzz.com" 
xmlns:p="http://abced.com" 
xmlns:q="http://pqr.com" 
xmlns="http://yyyzzz.com"> 

<xsd:element name="recipe" type="recipeType" /> 

<xsd:complexType name="recipeType"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
     <xsd:attribute name="desc" type="xsd:string" /> 
     <xsd:attribute name="archetype" type="xsd:string" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 
</xsd:schema> 

Các sơ đồ trên xác nhận vào tài liệu dưới đây:

<?xml version="1.0"?> 

<recipe xmlns="http://yyyzzz.com"> 
    Deciphering the purpose of targetNamespace 
</recipe> 

Lý do mà làm việc là vì xmlns = "http://yyyzzz.com" tự động liên kết với phần tử được định nghĩa bởi lược đồ! Điều đó có nghĩa là nó cũng liên kết với phần tử recipeType.

Giờ đây, với tài liệu xml tương tự nhưng với schema chút thay đổi như dưới đây cũng xác nhận và tham gia một cái nhìn cận cảnh sự khác biệt:

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema 
version="1.0" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://yyyzzz.com" 
xmlns="http://eigenfield.aparicio.com" 
xmlns:EGboy="http://yyyzzz.com"> 

<xsd:element name="recipe" type="EGboy:recipeType" /> 

<xsd:complexType name="recipeType"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
     <xsd:attribute name="desc" type="xsd:string" /> 
     <xsd:attribute name="archetype" type="xsd:string" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 

</xsd:schema> 

Bỏ qua nếu xmlns khác mất tích, nhưng thay vì nhìn kỹ vào type = "EGboy: recipeType". Chúng tôi không còn có thể dựa trên xmlns vì nó có giá trị khác nhau do đó, chúng tôi phải đặt tiền tố EGboy trước recipeType.

Các tài liệu xml thậm chí không quan tâm của EGboy prefix tiền tố này chỉ dành cho các giản đồ để chỉ đúng xmlns trong trường hợp có nhiều người.

2

targetNamespace là thuộc tính của schema yếu tố xác định không gian tên tức là gói trong tệp XSD. Theo quy ước, chúng tôi sử dụng URI/URL, nhưng chúng tôi có thể sử dụng bất kỳ chuỗi nào.

xmlns là thuộc tính được sử dụng để chỉ các phần tử và kiểu dữ liệu đến từ giá trị thuộc tính xmlns cho phạm vi phần tử hiện tại.

Ví dụ:

  • xmlns:xsd="http://www.w3.org/2001/XMLSchema" là với tiền tố như xsd nghĩa namespace nên được bắt đầu bằng xsd:
  • xmlns="http://www.w3.org/2001/XMLSchema" mà không tiền tố là mặc định
  • xmlns: p = "http: //www.example. com/Mọi người "có tiền tố là p có nghĩa là không gian tên phải được đặt trước bằng p:

Trường hợp xmlns:xsdxmlns:p là QNames và xmlns là tên địa phương.

Những hình ảnh sau đây giúp chúng ta hiểu XSD sử dụng Java tương tự theo hiểu biết của tôi:

enter image description here

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