targetNamespace và xmlns không có tiền tố, sự khác biệt là gì?


77

Trong tài liệu giản đồ xml, nếu tôi có cả targetNamespace và xmlns mà không có tiền tố .

<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ố, thì tất cả các phần tử không có tiền tố sẽ nhận được không gian tên đó và ... thật khó hiểu, điều này cũng xảy ra với targetNamespace.


1
Tôi có thể thiếu một số kiến ​​thức về chủ đề này, nhưng câu trả lời không thể 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 targetNamespace là không gian 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

@Vering các phát hiện thử nghiệm của tôi đồng ý với câu đầu tiên của bạn, vâng targetNamespace chắc chắn đề cập đến tài liệu mà lược đồ xác thực. 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'. Trên 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 thực.
eigenfield

Câu trả lời:


80

targetNamespace là một "tạo tác" của Lược đồ XML; 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à một tài liệu XML, nên sau đó có thể xác định một vùng tên XML mặc định cho chính tệp XML (đây là những gì thuộc tính xmlns làm); hàm ý là rất nhiều: tác giả và thành phần. Ví dụ: người ta không phải sử dụng tiền tố cho các mục được xác định trong lược đồ, tiền tố này 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 toàn cầu được sử dụng làm kiểu cho một thuộc tính hoặc phần tử).

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

Về mặt XSD, targetNamespace quy định phần không gian tên của tên đủ điều kiện của 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 cũng như các kiểu đơn giản và phức tạp. Một số tên đủ điều kiện được xác định trong XSD (các phần tử và thuộc tính) được "trực tiếp" sử dụng bởi một tài liệu phiên bản XML. Những người khác, chẳng hạn như kiểu, có thể được tham chiếu thông qua thuộc tính xsi: type trong các tài liệu XML. Phần còn lại (nhóm, nhóm thuộc tính) ở đó để tạo điều kiện thuận lợi cho việc thành phần lược đồ (thông qua tài liệu tham khảo).

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

  • để khớ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 không gian tên, đối với 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 có thuộc tính targetNamespace phù hợp.

  • mô hình hóa 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ả điều đó có nghĩa là trong trường hợp này. Về cơ bản đó là 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 mô hình trong các lĩnh vực chủ đề, v.v.


28

Đối với những người vẫn còn đang bối rối, hãy xem xét ba xsds này. Tất cả chúng đều xác định 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 nó.

Đầu tiên, một xsd như cái đã đăng ở trên. Nó sử dụng tiền tố 'xsd' cho không gian tên lược đồ và 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ờ cùng một xsd, nhưng xác định và sử dụng tiền tố không gian tên cho không gian tên đích:

<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 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ả lược đồ chọn cái đầu tiên hoặc cái cuối cùng, bởi vì nếu cơ sở không gian tên mặc định có sẵn thì chúng ta cũng có thể sử dụng nó cho việc gì đó .


15

xmlns

Thuộc tính xmlns đặt 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ả, phần tử này 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 đặt thành giá trị chuẩn cho tệp WSDL: http://www.w3.org/ns/wsdl

targetNameSpace

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

xmlns: tns

Không gian tên này phải được đặt thành cùng một URI với thuộc tính targetNameSpace. Bằng cách đó, bạn có thể tham chiếu đến 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


URI cho targetNamespace không "trỏ tới" bất cứ thứ gì - nó chỉ là một định danh cho không gian tên. Nó có thể là URI của một dịch vụ web, nhưng nó vẫn chỉ để gắn nhãn cho không gian tên.
Suncat2000

4

không gian tên có nghĩa là phạm vi

targetNamespacelà một thuộc tính của schemaphần 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à một thuộc tính được sử dụng để tham chiếu 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ố vì xsdcó nghĩa là không gian tên phải được bắt đầu bằngxsd:
  • xmlns="http://www.w3.org/2001/XMLSchema" không có tiền tố là mặc định
  • xmlns: p = "http://www.example.com/People" có tiền tố vì pkhông gian tên phải được bắt đầu bằngp:

Ở đâu xmlns:xsdxmlns:pđang QNames và xmlnslà tên địa phương.

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

nhập mô tả hình ảnh ở đây


1

Các câu trả lời khác là tốt ở đây, vì vậy tôi sẽ không lặp lại giải thích của họ ở đây. Tuy nhiên, nếu bất kỳ ai từ nền tảng Java, hãy thấy nó đơn giản hơn, đây là phép tương tự mà tôi đã nghĩ ra -

  1. .xsdtài liệu là tạo tác / .jartệp
  2. xmlns

    package com.example
    

    , bạn khai báo ở đầu các lớp Java của mình .

Hãy xem xét (để tương tự), nếu bạn có một gói duy nhất trong dự án Java của mình và tất cả các lớp được khai báo và định nghĩa trong một lớp bên ngoài duy nhất. Ví dụ,

    package com.furniture.models

    public class FurnitureShop {

         int noOfTables;
         int noOfChairs;
         int noOfBeds;
         List<Table> tables;
         List<Chair> chairs;
         List<Bed> beds;

         // and now instead of declaring and defining a class for table/chair/bed in a 
         // separate file, you just add it here 
         public static class Table {
             int height;
             int width;
             int length;
             ...
         }

         public static class Chair {
             String color;
             ChairType chairType;
             ...
         }

         public static class Sofa {
             int price;
             String color;
             ...
         }
    }

Đây là cách các phần tử khác nhau được nhóm trong một .xsdtệp, cho một lược đồ mới.

  1. targetNamespacelà tên của hiện vật bạn tạo ra. Như bạn có thể tự tìm hiểu, targetNamespacenó được sử dụng khi tạo một lược đồ, trong một .xsdtệp.

Sau khi tạo phần mềm (hoặc .xsdtệp) được tạo, bạn sẽ sử dụng nó trong các dự án khác như sau:

Trong một dự án Java, bạn sẽ nhập thư viện, sử dụng pom.xml(hoặc build.gradle) tệp như sau:

    <dependency>
       <groupId>com.furniture</groupId>
       <artifactId>furniture-apis</artifactId>
       <version>1.1.1</version>
    </dependency>

Trong XML, bạn "nhập" giản đồ bằng cách sử dụng

    <furniture xmlns="http://furniture.com"/>

=== PHỤ LỤC ===

Làm rõ -

  1. xmlnsvừa được sử dụng như một packagecâu lệnh, cũng như importcâu lệnh trong Java. Trong .xsdtệp, xmlnshoạt động như "package câu lệnh "", trong khi trong .xmltệp, nó hoạt động như importcâu lệnh "".

-1

Sau một số thử nghiệm 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 ở đây. Hãy xem xét lược đồ 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>

Lược đồ trên xác nhận tài liệu dưới đây:

<?xml version="1.0"?>

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

Lý do hoạt động là vì xmlns = "http://yyyzzz.com" cũng tự động liên kết với phần tử đang được lược đồ xác định! Điều đó có nghĩa là, nó cũng liên kết với công thức phần tử .

Bây giờ, với cùng một tài liệu xml nhưng với lược đồ được sửa đổi một chút như bên dưới cũng xác thực và hãy xem xét kỹ 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 các xmlns khác bị mất tích, nhưng thay vào đó hãy nhìn kỹ vào type = "EGboy: cookType" . Chúng ta không còn có thể dựa vào xmlns nữa vì nó có giá trị khác, do đó, chúng ta phải đặt tiền tố EGboy trước công thức. .

Tài liệu xml thậm chí không quan tâm đến tiền tố EGboy, tiền tố này chỉ dành cho lược đồ để tham chiếu đến các xmlns thích hợp trong trường hợp có nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.