การใช้ xsi: schemaLocation คืออะไร?


131

ฉันเห็นว่าเรามีหลาย url เป็นค่าของแอตทริบิวต์นี้เช่นในฤดูใบไม้ผลิ:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

ทำไมจึงจำเป็นและใช้ทำอะไร? Spring ไปที่ url และตรวจสอบความถูกต้องหรือไม่ ความแตกต่างระหว่าง xmlns และ xsi: schemaLocation คืออะไร?

คำตอบ:


87

ตัวแยกวิเคราะห์ Java XML ที่ Spring ใช้จะอ่านschemaLocationค่าและพยายามโหลดจากอินเทอร์เน็ตเพื่อตรวจสอบความถูกต้องของไฟล์ XML ในทางกลับกัน Spring จะสกัดกั้นคำขอโหลดเหล่านั้นและให้บริการเวอร์ชันจากภายในไฟล์ JAR ของตัวเอง

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


ตัวแยกวิเคราะห์ XML จะค้นหาพา ธ คลาสไม่ใช่หรือ
HDave

1
@skaffman หมายความว่าเมื่อฉันรัน maven build ของ projhect แบบสปริงด้วย -o (ออฟไลน์) แฟล็กบิลด์จะล้มเหลวแม้ว่าการอ้างอิงทั้งหมดจะมีอยู่ในที่เก็บในเครื่องของฉัน
aviad

@HDave แต่สิ่งที่ตัวแยกวิเคราะห์ XML จะมองหาสคีมาอาจมีชื่ออะไรก็ได้
Krzysztof Krasoń

ในทางเทคนิคขั้นแรกตัวแยกวิเคราะห์ XML จะพยายามโหลดสคีมาจากอินเทอร์เน็ตหากไม่พบหรือไม่สามารถเข้าถึงอินเทอร์เน็ตได้ก็จะค้นหาไฟล์ * .xsd ในเครื่องจากพา ธ คลาสหากยังไม่พบก็จะถูกละเว้น
Frank Zhang

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Spring Intercept Layer โปรดดูstackoverflow.com/a/10768972/32453
rogerdpack

68

An xmlnsเป็นตัวระบุที่ไม่ซ้ำกันภายในเอกสาร - ไม่จำเป็นต้องเป็น URI สำหรับสคีมา:

เนมสเปซ XML จัดเตรียมวิธีการง่ายๆสำหรับการกำหนดคุณสมบัติและชื่อแอ็ตทริบิวต์ที่ใช้ในเอกสาร Extensible Markup Language โดยการเชื่อมโยงกับเนมสเปซที่ระบุโดยการอ้างอิง URI

xsi:schemaLocation ควรให้คำแนะนำเกี่ยวกับตำแหน่งสคีมาจริง:

สามารถใช้ในเอกสารเพื่อให้คำแนะนำเกี่ยวกับตำแหน่งทางกายภาพของเอกสารสคีมาซึ่งอาจใช้สำหรับการประเมิน


22

ตามข้อมูลจำเพาะสำหรับการค้นหา Schemas

อาจมีหรือไม่มีการดึงสคีมาผ่านชื่อเนมสเปซ ... ชุมชนผู้ใช้และ / หรือข้อตกลงของผู้บริโภค / ผู้ให้บริการอาจสร้างสถานการณ์ที่ [พยายามดึงข้อมูล xsd จากเนมสเปซ url] เป็นกลยุทธ์เริ่มต้นที่สมเหตุสมผล

(ขอบคุณสำหรับความชัดเจนข้อมูลจำเพาะ!)

และ

ในกรณีที่ผู้เขียนเอกสาร (มนุษย์หรือไม่) สร้างเอกสารที่มีสคีมาเฉพาะในมุมมองและรับประกันว่าเอกสารบางส่วนหรือทั้งหมดเป็นไปตามสคีมานั้นจะมีการจัดเตรียม schemaLocation และ noNamespaceSchemaLocation [แอตทริบิวต์]

ดังนั้นโดยพื้นฐานแล้วในการระบุเพียงเนมสเปซ XML ของคุณ "อาจ" ถูกพยายามตรวจสอบเทียบกับ xsd ที่ตำแหน่งนั้น (แม้ว่าจะไม่มีschemaLocationแอตทริบิวต์ก็ตาม) ทั้งนี้ขึ้นอยู่กับ "ชุมชน" ของคุณ หากคุณระบุเฉพาะเจาะจงแสดงschemaLocationว่าโดยพื้นฐานแล้วเอกสาร xml "ควร" สอดคล้องกับ xsd ที่กล่าวไว้ดังนั้น "โปรดตรวจสอบความถูกต้อง" (ตามที่ฉันอ่าน) ฉันเดาว่าถ้าคุณไม่ทำ a schemaLocationหรือnoNamespaceSchemaLocationแอตทริบิวต์มันก็แค่ "ไม่ผ่านการตรวจสอบ" ส่วนใหญ่ (ตามคำตอบอื่น ๆ ดูเหมือนว่า java จะทำแบบนี้)

ริ้วรอยอีกประการหนึ่งคือโดยทั่วไปเมื่อมีการตรวจสอบความถูกต้อง xsd ในไลบรารี java [เช่นไฟล์ spring config xml] หากไฟล์ XML ของคุณระบุschemaLocationURL xsd เฉพาะในไฟล์ XML เช่นxsi:schemaLocation="http://somewhere http://somewhere/something.xsd"โดยทั่วไปภายในหนึ่งในไหการพึ่งพาของคุณจะมีสำเนาของ ไฟล์ xsd นั้นในส่วนทรัพยากรและฤดูใบไม้ผลิมีความสามารถในการ "แมป" ที่บอกว่าให้ปฏิบัติกับไฟล์ xsd นั้นราวกับว่ามันแมปกับ url http://somewhere/something.xsd(ดังนั้นคุณจะไม่ต้องเข้าเว็บและดาวน์โหลดไฟล์ แต่มันมีอยู่ในเครื่องเท่านั้น) ดูhttps://stackoverflow.com/a/41225329/32453สำหรับข้อมูลเพิ่มเติมเล็กน้อย


0

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.