“ xmlns” ใน XML หมายถึงอะไร


415

ฉันเห็นบรรทัดต่อไปนี้ในไฟล์ XML:

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

ฉันยังเห็นxmlnsในไฟล์ XML อื่น ๆ อีกมากมายที่ฉันเจอ

มันคืออะไร?




ตอนนี้คุณก็ต้องรู้ด้วยว่าทำไมเราถึงได้รับข้อผิดพลาดใน xml เมื่อเราใช้แท็กไม่ถูกต้องหรือผิดที่ :)
Vaibs

คำตอบ:


299

มันกำหนด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/


62
ฉันมักจะวาง URIs เหล่านั้นลงในเว็บเบราว์เซอร์เพื่อดูว่าตัวแยกวิเคราะห์กำลังมองหาอะไร แต่จะคืนค่า 404 เสมอหรือไม่ควรเป็น URI จริงที่ต้องการชื่อไฟล์มาตรฐานที่แนบท้ายหรือเป็นเพียงเทคนิค ทำรหัสที่ไม่ซ้ำกัน?
Patrick

36
@ แพทริกใช่มันเป็นเพียง URI ที่ต้องไม่ซ้ำกันเพื่อระบุว่าเป็นเนมสเปซที่แยกต่างหากจากผู้อื่นและดังนั้นแท็กที่ซ้ำกันใด ๆ ที่อาจเกิดขึ้นจะถูกตีความอย่างถูกต้อง ดังนั้น URI มักจะชี้ไปที่ไม่มีอะไร
foochow

3
อืม ... ดีที่รู้ว่าเป็นเนมสเปซ ฉันเคยสงสัยว่าการระบุ URI ทำให้หน้า html เข้าถึงเว็บไซต์นั้นเพื่อพิจารณาสกีมาหรือไม่
Nav

17
@Patrick, URI นั้นไม่เหมือนกับ URL URL เป็นตัวระบุตำแหน่งและ URI เป็นเพียงตัวระบุ คุณสามารถเลือก GUID เป็น URI ได้เป็นอย่างดี ความจริงแล้ว ISBN ที่เรามีสำหรับหนังสือเป็นรูปแบบของ URI
Jaywalker

แล้วแท็กทำงานอย่างไร ฉันหมายถึง<LinearLayoutทำงานโดยไม่ต้องขึ้นต้น?
Asif Mushtaq

676

มันหมายความว่า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>

13
+1 คำตอบแนวคิดที่ดีและเป็นประโยชน์ คุณอาจต้องการผ่านการรับรอง "โดยทั่วไปทุกองค์ประกอบ (หรือแอตทริบิวต์) ใน xml เป็นของเนมสเปซ" เนื่องจากองค์ประกอบและคุณลักษณะบางอย่างมีการกล่าวถึงว่าเป็น "ไม่มีเนมสเปซ" แม้ว่าฉันเข้าใจว่าคุณกำลังให้พื้นฐาน
LarsH

1
@Rob Levine "แอตทริบิวต์สามารถกำหนดเนมสเปซได้ แต่โดยทั่วไปจะไม่" แล้ว Android ล่ะ
Paul Brewczynski

1
ดังนั้นตัวอย่างเช่น " your.example.com/xml/person " จึงถูกใช้อย่างไร โอเคฉันมีแท็ก <person: name> ตอนนี้อะไรนะ? คุณช่วยอธิบายสิ่งนี้ด้วยได้มั้ย
Koray Tugay

1
@WORMSS - ใช่ - คุณพูดถูก เมื่อคุณกำหนดคิวรีของคุณคุณจะต้องระบุเนมสเปซซึ่งอาจใช้คำนำหน้า ตัวอย่างเช่นในโลก C # System.Xml คุณจะต้องลงทะเบียนคำนำหน้ากับตัวจัดการเนมสเปซโดยใช้ XmlNamespaceManager.AddNamespace จากนั้นใช้คำนำหน้านี้ในแบบสอบถามของคุณ ความจริงที่คำนำหน้าไม่ปรากฏในเอกสารไม่สำคัญ - เฉพาะเนมสเปซที่แมปด้วย
Rob Levine

2
ลิงก์เอกสารของ Microsoft นี้: " msdn.microsoft.com/en-us/library/aa468565.aspx " อธิบายเนมสเปซใน XML เป็นอย่างดี
Deen John

16

ฉันคิดว่าความสับสนที่ยิ่งใหญ่ที่สุดคือเนมสเปซ xml ชี้ไปยัง URL บางประเภทที่ไม่มีข้อมูลใด ๆ แต่ความจริงก็คือบุคคลที่คิดค้นด้านล่างชื่อ:

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

ยังสามารถเรียกมันว่า:

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

นี่เป็นเพียงตัวระบุที่ไม่ซ้ำกัน อย่างไรก็ตามมีการกำหนดว่าคุณควรใส่ URL ที่ไม่ซ้ำใครและอาจชี้ไปที่ข้อมูลจำเพาะของแท็ก / แอตทริบิวต์ที่ใช้ในเนมสเปซนั้น มันไม่จำเป็นต้องใช้ท่อ

ทำไมมันควรจะไม่ซ้ำกัน? เนื่องจากวัตถุประสงค์ของเนมสเปซคือการทำให้มันไม่ซ้ำกันดังนั้นแอตทริบิวต์สำหรับตัวอย่างที่เรียกว่าพื้นหลังจากเนมสเปซของคุณสามารถแยกความแตกต่างจากพื้นหลังจากเนมสเปซอื่น

เนื่องจากความเป็นเอกลักษณ์ดังกล่าวคุณไม่จำเป็นต้องกังวลว่าหากคุณสร้างแอตทริบิวต์ที่กำหนดเองคุณจะต้องมีการชนกันของชื่อ


สวัสดี Morfidon กรุณาคุณสามารถเพิ่มลิงค์ตอบไปยังการอ้างอิงที่ระบุว่าเนื้อหาหรือ URL สามารถเป็นอะไรได้หรือไม่? สิ่งที่จะต้องไม่ซ้ำกัน? โปรดอธิบายความแตกต่าง: ชื่อของเนมสเปซ XML หรือเนื้อหาของ URL หรือไม่ ไชโย
โอลิเบอร์

@olibre หากคุณต้องการใช้ namespace ของ android คุณควรใช้ชื่อของพวกเขา นั่นคือชื่อเฉพาะของพวกเขา พวกเขาตัดสินใจใส่ URL หากคุณกำลังสร้างเนมสเปซของคุณเองคุณสามารถเรียกมันว่าอะไรก็ได้ที่คุณต้องการ มีการกล่าวว่าคุณควรใช้ URL ที่ชี้ไปยังสถานที่ที่คุณอธิบายสิ่งที่อยู่ในเนมสเปซนั้น แต่อย่างที่คุณเห็นผู้สร้างเนมสเปซ Android ไม่สามารถทำได้
Morfidon

ขอบคุณ Morfidon ฉันได้เข้าใจในที่สุดจุดว่าในขณะที่อ่านคำตอบของร็อบ ฉันชอบคำตอบของคุณเพราะมันเป็นสิ่งสำคัญที่ไม่เป็นที่รู้จัก แต่โปรดพยายามปรับปรุงคำตอบของคุณชี้แจงว่าส่วนใดที่จะต้องไม่ซ้ำกันให้ข้อมูลอ้างอิงใช้ถ้อยคำใหม่ตรวจสอบถ้อยคำ ... ผู้อ่านบางคนอาจสับสนโดยคำตอบปัจจุบันของคุณ ไชโย
โอลิเบอร์

1
นี่คือคำตอบที่ฉันต้องการ! ดังนั้นสับสนที่จะใช้ URI สำหรับค่าคุณลักษณะนี้เนื่องจากผู้คนคิดว่า URI = URL และคาดหวังว่าเอกสารบางอย่างควรอยู่ในตำแหน่ง แต่ AFAICT ไม่เป็นไรหาก URI ส่งคืน 404 มันเป็นเพียงตัวระบุที่ไม่ซ้ำกันซึ่งดูเหมือนจะเป็นที่อยู่ อาจมีผู้ตรวจสอบพิเศษบางคนที่คาดว่าจะพบ schema หรือ DTD ที่ตำแหน่งนั้น (ซึ่งน่าจะสมเหตุสมผล) แต่นี่เป็นกรณีพิเศษที่ฉันคิด โปรดแก้ไขฉันหากฉันผิดที่นี่
brennanyoung

1
@brennanyoung มันตรงตามที่คุณได้กล่าว :)
Morfidon

12

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 ไฟล์เดียว หากไม่มีเนมสเปซไฟล์นี้จะไม่ถูกต้อง


4

คุณมีช่องว่างชื่อเพื่อให้คุณสามารถมีองค์ประกอบที่ไม่ซ้ำกันทั่วโลก อย่างไรก็ตาม 99% ของเวลานี้ไม่สำคัญ แต่เมื่อคุณใส่ในมุมมองของThe Semantic Webมันเริ่มมีความสำคัญ

ตัวอย่างเช่นคุณสามารถทำให้ XML mash-up xmlnsของรูปแบบที่แตกต่างกันโดยใช้เพียงแค่ที่เหมาะสม ตัวอย่างเช่นผสมเพื่อนของเพื่อนด้วยvCardเป็นต้น


สำหรับ xml เล็ก ๆ น้อย ๆ มันอาจทำให้ฉันสนใจ, สำหรับทุกอย่างอื่น namespaces มีความสำคัญอย่างยิ่ง + ฉันไม่เห็นการเชื่อมต่อระหว่างเว็บความหมายและเนมสเปซ เว็บความหมายเป็นแนวคิดเนมสเปซเป็นส่วนหนึ่งของมาตรฐาน XML คุณกำลังผสมคำจำกัดความของอินเทอร์เฟซและรายละเอียดการใช้งาน
Newtopian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.