ฉันเห็นบรรทัดต่อไปนี้ในไฟล์ XML:
xmlns:android="http://schemas.android.com/apk/res/android"
ฉันยังเห็นxmlns
ในไฟล์ XML อื่น ๆ อีกมากมายที่ฉันเจอ
มันคืออะไร?
ฉันเห็นบรรทัดต่อไปนี้ในไฟล์ XML:
xmlns:android="http://schemas.android.com/apk/res/android"
ฉันยังเห็นxmlns
ในไฟล์ XML อื่น ๆ อีกมากมายที่ฉันเจอ
มันคืออะไร?
คำตอบ:
มันกำหนดNamespace XML
ในตัวอย่างของคุณNamespace Prefixคือ " android " และNamespace URIคือ " http://schemas.android.com/apk/res/android "
ในเอกสารคุณจะเห็นองค์ประกอบต่างๆเช่น: <android:foo />
คิดว่าส่วนนำหน้าเนมสเปซเป็นตัวแปรที่มีชื่อแทนแบบสั้นสำหรับ URI เนมสเปซแบบเต็ม มันเทียบเท่า<http://schemas.android.com/apk/res/android:foo />
กับการเขียนเกี่ยวกับสิ่งที่ "หมายถึง" เมื่อตัวแยกวิเคราะห์ XML อ่านเอกสาร
หมายเหตุ:คุณไม่สามารถใช้ URI เนมสเปซแบบเต็มแทนการใช้ส่วนนำหน้าเนมสเปซในเอกสารอินสแตนซ์ XML
ลองดูบทแนะนำนี้เกี่ยวกับ namespaces: http://www.sitepoint.com/xml-namespaces-explained/
<LinearLayout
ทำงานโดยไม่ต้องขึ้นต้น?
มันหมายความว่าnamespace XML
โดยทั่วไปทุกองค์ประกอบ (หรือแอตทริบิวต์) ในXMLเป็นของ namespace ซึ่งเป็นวิธีการ "คัดเลือก" ชื่อขององค์ประกอบ
ลองนึกภาพคุณและฉันทั้งคู่คิดค้น XML ของเราเอง คุณคิดค้น XML เพื่ออธิบายผู้คนฉันคิดค้นเหมืองเพื่ออธิบายเมือง name
เราทั้งคู่มีองค์ประกอบที่เรียกว่า คุณหมายถึงชื่อของบุคคลนั้นและเป็นชื่อเมือง - โอเคมันเป็นเรื่องเล็กน้อย
<person>
<name>Rob</name>
<age>37</age>
<homecity>
<name>London</name>
<lat>123.000</lat>
<long>0.00</long>
</homecity>
</person>
หาก XML สองตัวของเรารวมกันเป็นเอกสารเดียวเราจะบอกชื่อทั้งสองได้อย่างไร? อย่างที่คุณเห็นด้านบนมีสองname
องค์ประกอบ แต่ทั้งคู่มีความหมายต่างกัน
คำตอบคือคุณและฉันจะกำหนด namespace ให้กับ XML ของเราซึ่งเราจะสร้างเอกลักษณ์ให้:
<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>
ตอนนี้เราได้ผ่านการรับรอง XML ของเราอย่างสมบูรณ์แล้วไม่มีความคลุมเครือเกี่ยวกับความname
หมายของแต่ละองค์ประกอบ แท็กทั้งหมดที่เริ่มต้นด้วยpersonxml:
เป็นแท็กที่เป็นของ XML ของคุณแท็กทั้งหมดที่เริ่มต้นด้วยcityxml:
เป็นของฉัน
มีกี่จุดที่ควรทราบ:
หากคุณแยกการประกาศเนมสเปซใด ๆ สิ่งต่าง ๆ จะถือว่าอยู่ในเนมสเปซเริ่มต้น
หากคุณประกาศเนมสเปซที่ไม่มีตัวระบุนั่นคือxmlns="http://somenamespace"
แทนที่จะxmlns:rob="somenamespace"
เป็นตัวระบุมันจะกำหนดเนมสเปซเริ่มต้นสำหรับเอกสาร
เนมสเปซที่แท้จริงนั้นมักจะเป็นIRIซึ่งไม่มีผลที่แท้จริง มันควรจะไม่ซ้ำกันดังนั้นผู้คนมักจะเลือก IRI / URI ที่พวกเขาเป็นเจ้าของ แต่ไม่มีความหมายมากไปกว่านั้น บางครั้งผู้คนจะวางสคีมา (คำจำกัดความ) สำหรับ XML ที่ IRI ที่ระบุ แต่เป็นแบบแผนของบางคนเท่านั้น
คำนำหน้าจะไม่มีผลใด ๆ สิ่งเดียวที่มีความสำคัญคือสิ่งที่ namespace คำนำหน้าหมายถึง หลายแท็กเริ่มต้นด้วยคำนำหน้าที่แตกต่างกันทั้งหมดซึ่งแมปไปยังเนมสเปซเดียวกันจะถือว่าเหมือนกัน
ตัวอย่างเช่นหากคำนำหน้าpersonxml
และmycityxml
ทั้งคู่แมปกับเนมสเปซเดียวกัน (เช่นในตัวอย่างด้านล่าง) ก็ไม่เป็นไรถ้าคุณนำหน้าองค์ประกอบที่กำหนดด้วยpersonxml
หรือmycityxml
พวกเขาทั้งสองจะได้รับการปฏิบัติเหมือนกันโดยตัวแยกวิเคราะห์ XML . ประเด็นก็คือตัวแยกวิเคราะห์ XML ไม่สนใจสิ่งที่คุณเลือกเป็นคำนำหน้าเฉพาะเนมสเปซที่จะจับคู่ด้วย คำนำหน้าเป็นเพียงร้ายชี้ไปที่การ namespace
<personxml:person
xmlns:personxml="http://example.com/same/url"
xmlns:mycityxml="http://example.com/same/url" />
คุณสมบัติสามารถมีคุณสมบัติได้ แต่โดยทั่วไปจะไม่ พวกเขายังไม่ได้รับ namespace ของพวกเขาจากองค์ประกอบที่พวกเขาอยู่ตรงข้ามกับองค์ประกอบ (ดูด้านล่าง)
นอกจากนี้เนมสเปซองค์ประกอบยังสืบทอดมาจากองค์ประกอบหลัก ในคำอื่น ๆ ฉันสามารถเขียน XML ข้างต้นเท่า ๆ กันเป็น
<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>
ฉันคิดว่าความสับสนที่ยิ่งใหญ่ที่สุดคือเนมสเปซ xml ชี้ไปยัง URL บางประเภทที่ไม่มีข้อมูลใด ๆ แต่ความจริงก็คือบุคคลที่คิดค้นด้านล่างชื่อ:
xmlns:android="http://schemas.android.com/apk/res/android"
ยังสามารถเรียกมันว่า:
xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"
นี่เป็นเพียงตัวระบุที่ไม่ซ้ำกัน อย่างไรก็ตามมีการกำหนดว่าคุณควรใส่ URL ที่ไม่ซ้ำใครและอาจชี้ไปที่ข้อมูลจำเพาะของแท็ก / แอตทริบิวต์ที่ใช้ในเนมสเปซนั้น มันไม่จำเป็นต้องใช้ท่อ
ทำไมมันควรจะไม่ซ้ำกัน? เนื่องจากวัตถุประสงค์ของเนมสเปซคือการทำให้มันไม่ซ้ำกันดังนั้นแอตทริบิวต์สำหรับตัวอย่างที่เรียกว่าพื้นหลังจากเนมสเปซของคุณสามารถแยกความแตกต่างจากพื้นหลังจากเนมสเปซอื่น
เนื่องจากความเป็นเอกลักษณ์ดังกล่าวคุณไม่จำเป็นต้องกังวลว่าหากคุณสร้างแอตทริบิวต์ที่กำหนดเองคุณจะต้องมีการชนกันของชื่อ
xmlns - xml เนมสเปซ เป็นเพียงวิธีการหลีกเลี่ยงความขัดแย้งของชื่อองค์ประกอบ ตัวอย่างเช่น:
<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>
node
องค์ประกอบสองอย่างที่แตกต่างกันในไฟล์ xml ไฟล์เดียว หากไม่มีเนมสเปซไฟล์นี้จะไม่ถูกต้อง
คุณมีช่องว่างชื่อเพื่อให้คุณสามารถมีองค์ประกอบที่ไม่ซ้ำกันทั่วโลก อย่างไรก็ตาม 99% ของเวลานี้ไม่สำคัญ แต่เมื่อคุณใส่ในมุมมองของThe Semantic Webมันเริ่มมีความสำคัญ
ตัวอย่างเช่นคุณสามารถทำให้ XML mash-up xmlns
ของรูปแบบที่แตกต่างกันโดยใช้เพียงแค่ที่เหมาะสม ตัวอย่างเช่นผสมเพื่อนของเพื่อนด้วยvCardเป็นต้น