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 xmlns
trong nhiều tệp XML khác mà tôi đã gặp.
Nó là gì?
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 xmlns
trong nhiều tệp XML khác mà tôi đã gặp.
Nó là gì?
Câu trả lời:
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/
<LinearLayout
làm việc mà không có tiền tố?
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 name
yế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ề ý name
nghĩ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ố personxml
và mycityxml
cả 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 personxml
hoặ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>
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.
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 node
yế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ệ.
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.