Không có nghĩa là gì xmlns của XML trong XML?


415

Tôi thấy dòng sau trong một tệp XML:

xmlns:android="http://schemas.android.com/apk/res/android"

Tôi cũng đã thấy xmlnstrong nhiều tệp XML khác mà tôi đã gặp.

Nó là gì?




Bây giờ bạn cũng sẽ phải biết rằng tại sao chúng tôi gặp lỗi trong xml khi chúng tôi sử dụng các thẻ không chính xác hoặc sai địa điểm. :)
Vaibs

Câu trả lời:


299

Nó định nghĩa một không gian tên XML .

Trong ví dụ của bạn, Tiền tố không gian tên là " android " và URI không gian tên là " http://schemas.android.com/apk/res/android "

Trong tài liệu, bạn thấy các yếu tố như: <android:foo />

Hãy nghĩ về tiền tố không gian tên như một biến có bí danh tên ngắn cho URI không gian tên đầy đủ. Nó tương đương với việc viết <http://schemas.android.com/apk/res/android:foo />liên quan đến ý nghĩa của nó khi trình phân tích cú pháp XML đọc tài liệu.

LƯU Ý: Bạn thực sự không thể sử dụng URI không gian tên đầy đủ thay cho tiền tố không gian tên trong tài liệu cá thể XML.

Kiểm tra hướng dẫn này về không gian tên: http://www.sitepoint.com/xml-namespaces-explained/


62
Tôi luôn dán các URI đó vào trình duyệt web để xem trình phân tích cú pháp đang xem gì, nhưng nó luôn trả về 404. Đây có phải là một URI thực sự cần một tên tệp tiêu chuẩn được xử lý đến cuối không, hay đó chỉ là một kỹ thuật để làm một id duy nhất?
Patrick

36
@Patrick có, nó chỉ là một URI cần phải là duy nhất để chỉ ra rằng đó là một không gian tên riêng biệt với các không gian khác và do đó, bất kỳ thẻ trùng lặp tiềm năng nào cũng sẽ được giải thích chính xác. Vì vậy, URI thường sẽ chỉ ra không có gì.
foochow

3
Hmm ... thật tốt khi biết đó là một không gian tên. Tôi đã từng tự hỏi liệu việc chỉ định một URI có khiến trang html thực sự truy cập trang web đó để xác định một lược đồ hay không.
Nav

17
@Patrick, URI không giống như URL. URL là một công cụ định vị và URI chỉ là một định danh. Bạn rất có thể chọn GUID làm URI. Trên thực tế, ISBN mà chúng tôi có cho sách là một dạng URI.
Jaywalker

Sau đó, thẻ hoạt động như thế nào? Ý tôi là <LinearLayoutlàm việc mà không có tiền tố?
Asif Mushtaq

676

Nó có nghĩa là không gian tên XML .

Về cơ bản, mọi phần tử (hoặc thuộc tính) trong XML thuộc về một không gian tên, một cách "đủ điều kiện" tên của phần tử.

Hãy tưởng tượng bạn và tôi đều phát minh ra XML của riêng mình. Bạn phát minh ra XML để mô tả mọi người, tôi phát minh ra tôi để mô tả các thành phố. Cả hai chúng tôi bao gồm một yếu tố được gọi là name. Bạn đề cập đến tên của người đó và của tôi với tên thành phố là OK OK, đó là một chút giả định.

<person>
    <name>Rob</name>
    <age>37</age>
    <homecity>
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

Nếu hai XML của chúng tôi được kết hợp thành một tài liệu duy nhất, chúng tôi sẽ phân biệt hai tên như thế nào? Như bạn có thể thấy ở trên, có hai nameyếu tố, nhưng cả hai đều có ý nghĩa khác nhau.

Câu trả lời là cả bạn và tôi đều sẽ gán một không gian tên cho XML của chúng tôi, chúng tôi sẽ tạo ra sự độc đáo:

<personxml:person xmlns:personxml="http://www.your.example.com/xml/person"
                  xmlns:cityxml="http://www.my.example.com/xml/cities">
    <personxml:name>Rob</personxml:name>
    <personxml:age>37</personxml:age>
    <cityxml:homecity>
        <cityxml:name>London</cityxml:name>
        <cityxml:lat>123.000</cityxml:lat>
        <cityxml:long>0.00</cityxml:long>
    </cityxml:homecity>
</personxml:person>

Bây giờ chúng tôi hoàn toàn đủ điều kiện XML của chúng tôi, không có sự mơ hồ về ý namenghĩa của từng yếu tố. Tất cả các thẻ bắt đầu bằng personxml:là các thẻ thuộc về XML của bạn, tất cả các thẻ bắt đầu bằng cityxml:của tôi.

Có một vài điểm cần lưu ý:

  • Nếu bạn loại trừ bất kỳ khai báo không gian tên nào, mọi thứ được coi là trong không gian tên mặc định.

  • Nếu bạn khai báo một không gian tên mà không có mã định danh, nghĩa là xmlns="http://somenamespace", thay vì xmlns:rob="somenamespace", nó chỉ định không gian tên mặc định cho tài liệu.

  • Không gian tên thực tế, thường là IRI , không có kết quả thực sự. Nó phải là duy nhất, vì vậy mọi người có xu hướng chọn IRI / URI mà họ sở hữu, nhưng nó không có ý nghĩa lớn hơn thế. Đôi khi mọi người sẽ đặt lược đồ (định nghĩa) cho XML tại IRI được chỉ định, nhưng đó chỉ là quy ước của một số người.

  • Tiền tố cũng không có hậu quả. Điều duy nhất quan trọng là không gian tên tiền tố được định nghĩa là gì. Một số thẻ bắt đầu bằng các tiền tố khác nhau, tất cả các ánh xạ tới cùng một không gian tên được coi là giống nhau.

    Chẳng hạn, nếu các tiền tố personxmlmycityxmlcả hai được ánh xạ tới cùng một không gian tên (như trong đoạn trích bên dưới), thì sẽ không có vấn đề gì nếu bạn đặt tiền tố cho một phần tử đã cho bằng personxmlhoặc mycityxml, cả hai đều được xử lý như nhau bởi một trình phân tích cú pháp XML . Vấn đề là trình phân tích cú pháp XML không quan tâm đến những gì bạn đã chọn làm tiền tố, chỉ có không gian tên mà nó ánh xạ. Tiền tố chỉ là một gián tiếp chỉ vào không gian tên.

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
  • Các thuộc tính có thể đủ điều kiện nhưng thường không. Họ cũng không kế thừa không gian tên của họ từ phần tử mà họ đang bật, trái ngược với các phần tử (xem bên dưới).

Ngoài ra, không gian tên phần tử được kế thừa từ phần tử cha. Nói cách khác, tôi cũng có thể viết XML ở trên như

<person xmlns="http://www.your.example.com/xml/person">
    <name>Rob</name>
    <age>37</age>
    <homecity xmlns="http://www.my.example.com/xml/cities">
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

13
+1 tốt, câu trả lời khái niệm hữu ích. Bạn có thể muốn đủ điều kiện "Về cơ bản, mọi thành phần (hoặc thuộc tính) trong xml đều thuộc về một không gian tên", vì một số thành phần và thuộc tính được cho là trong "không có không gian tên". Mặc dù tôi hiểu bạn đã đưa ra những điều cơ bản.
LarsH

1
@Rob Levine "Các thuộc tính có thể được đặt tên nhưng thường thì không." Android thì sao?
Paul Brewczynski

1
Vậy ví dụ " your.example.com/xml/person " được sử dụng như thế nào? Ok tôi có thẻ <person: name>, bây giờ thì sao? Bạn có thể giải thích điều này là tốt xin vui lòng?
Koray Tugay

1
@WORMSS - Có - bạn đúng. Khi bạn xác định truy vấn của mình, bạn cần chỉ định không gian tên, có thể thông qua tiền tố. Ví dụ, trong thế giới C # System.Xml, bạn sẽ đăng ký tiền tố với trình quản lý không gian tên bằng XmlNamespaceManager.AddNamespace, sau đó sử dụng tiền tố này trong truy vấn của bạn. Thực tế tiền tố không xuất hiện trong tài liệu không quan trọng - chỉ có không gian tên mà nó ánh xạ.
Rob Levine

2
Liên kết tài liệu microsoft này: " msdn.microsoft.com/en-us/l Library / aa468565.aspx " giải thích không gian tên trong XML rất tốt.
Deen John

16

Tôi nghĩ rằng sự nhầm lẫn lớn nhất là không gian tên xml đang trỏ đến một loại URL nào đó không có bất kỳ thông tin nào. Nhưng sự thật là người đã phát minh ra bên dưới không gian tên:

xmlns:android="http://schemas.android.com/apk/res/android"

cũng có thể gọi nó như thế:

xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"

Đây chỉ là một định danh duy nhất. Tuy nhiên, nó được thiết lập rằng bạn nên đặt URL đó là duy nhất và có khả năng có thể trỏ đến đặc điểm kỹ thuật của các thẻ / thuộc tính được sử dụng trong không gian tên đó. Nó không bắt buộc tho.

Tại sao nó phải là duy nhất? Vì mục đích không gian tên là để chúng là duy nhất nên thuộc tính được gọi là nền từ không gian tên của bạn có thể được phân biệt với nền từ không gian tên khác.

Vì sự độc đáo đó, bạn không cần phải lo lắng rằng nếu bạn tạo thuộc tính tùy chỉnh, bạn sẽ có xung đột tên.


Xin chào Morfidon. Xin vui lòng, bạn có thể thêm vào câu trả lời của mình một liên kết đến một tham chiếu chỉ định rằng nội dung hoặc URL có thể là bất cứ điều gì không? Điều gì phải là duy nhất? Cũng xin làm rõ tính duy nhất: Tên của không gian tên XML hoặc nội dung của URL? Chúc mừng
olibre

@olibre Nếu bạn muốn sử dụng không gian tên của Android, bạn nên sử dụng tên của họ. Đó là tên duy nhất của họ. Họ quyết định đặt một URL. Nếu bạn đang tạo không gian tên của riêng mình thì bạn có thể gọi nó là bất cứ thứ gì bạn muốn chỉ cần đảm bảo nó là duy nhất. Người ta nói rằng bạn nên sử dụng URL trỏ đến nơi bạn mô tả những gì bên trong không gian tên đó nhưng như bạn có thể thấy ngay cả những người tạo không gian tên Android cũng không làm điều đó.
Morfidon

Cảm ơn Morfidon. Cuối cùng tôi đã hiểu điểm đó trong khi đọc câu trả lời của Rob . Tôi thích câu trả lời của bạn vì nó làm nổi bật một khía cạnh quan trọng không được biết đến nhiều. Nhưng hãy cố gắng cải thiện câu trả lời của bạn, làm rõ phần nào phải là duy nhất, cung cấp tài liệu tham khảo, viết lại, kiểm tra từ ngữ ... Một số độc giả có thể bị nhầm lẫn bởi câu trả lời hiện tại của bạn. Chúc mừng
olibre

1
Đây là câu trả lời tôi cần! Thật khó hiểu khi sử dụng URI cho giá trị thuộc tính này, bởi vì mọi người nghĩ URI = URL và mong đợi rằng một số tài liệu sẽ nằm ở vị trí. Nhưng AFAICT hoàn toàn ổn nếu URI trả về 404. Nó chỉ là một mã định danh duy nhất trông giống như một địa chỉ. Có thể có một số trình xác nhận đặc biệt mong muốn tìm thấy một lược đồ hoặc DTD tại vị trí đó (điều này sẽ có ý nghĩa), nhưng đây là những trường hợp đặc biệt tôi nghĩ. Xin hãy sửa tôi nếu tôi sai ở đây.
brennanyoung

1
@brennanyoung đúng như bạn đã nói :)
Morfidon

12

xmlns - không gian tên xml. Đó chỉ là một phương pháp để tránh xung đột tên thành phần. Ví dụ:

<config xmlns:rnc="URI1" xmlns:bsc="URI2">
  <rnc:node>
      <rnc:rncId>5</rnc:rncId>
  </rnc:node>

  <bsc:node>
      <bsc:cId>5</bsc:cId>
  </bsc:node>
</config>

Hai nodeyếu tố khác nhau trong một tệp xml. Không có không gian tên, tập tin này sẽ không hợp lệ.


4

Bạn có không gian tên để bạn có thể có các yếu tố độc đáo trên toàn cầu. Tuy nhiên, 99% thời gian điều này không thực sự quan trọng, nhưng khi bạn đặt nó trong phối cảnh của Semantic Web , nó bắt đầu trở nên quan trọng.

Ví dụ: bạn có thể tạo ra một bản tổng hợp XML của các lược đồ khác nhau chỉ bằng cách sử dụng thích hợp xmlns. Ví dụ: kết hợp bạn của một người bạn với vCard , v.v.


đối với xml tầm thường, tôi có thể bỏ qua, vì mọi thứ khác không gian tên là cực kỳ quan trọng. + Tôi thực sự không thấy kết nối giữa web ngữ nghĩa và không gian tên. Web ngữ nghĩa là một khái niệm, không gian tên là một phần của tiêu chuẩn XML, bạn đang trộn lẫn định nghĩa giao diện và chi tiết triển khai.
Newtopian
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.