วิธีที่ถูกต้องในการแสดงองค์ประกอบ XML ที่เป็นโมฆะคืออะไร?


166

ฉันได้เห็นnullองค์ประกอบต่างๆหลายวิธี:

องค์ประกอบมีอยู่ด้วยxsi:nil="true":

 <book>
     <title>Beowulf</title>
     <author xsi:nil="true"/>
 </book>

องค์ประกอบมีอยู่ แต่แสดงเป็นองค์ประกอบที่ว่างเปล่า (ซึ่งฉันเชื่อว่าผิดตั้งแต่ 'ว่างเปล่า' และnullมีความแตกต่างทางความหมาย):

 <book>
     <title>Beowulf</title>
     <author/>
 </book>

 <!-- or: -->
 <book>
     <title>Beowulf</title>
     <author></author>
 </book>

องค์ประกอบไม่มีอยู่ในมาร์กอัปที่ส่งคืน :

 <book>
     <title>Beowulf</title>
 </book>

องค์ประกอบมี<null/>องค์ประกอบย่อย (จากTStamperด้านล่าง):

 <book>
     <title>Beowulf</title>
     <author><null/></author>
 </book>

มีวิธีที่ถูกต้องหรือเป็นที่ยอมรับในการเป็นตัวแทนของnullค่าดังกล่าวหรือไม่? มีวิธีอื่นนอกเหนือจากตัวอย่างข้างต้นหรือไม่?

XML สำหรับตัวอย่างด้านบนมีการวางแผนไว้ดังนั้นอย่าอ่านมากเกินไป :)

คำตอบ:


121

xsi: nil เป็นวิธีที่ถูกต้องในการแสดงค่าเช่น: เมื่อเรียกใช้ DOM ระดับ 2 getElementValue () จะมีการส่งคืนค่า NULL xsi: nil ยังใช้เพื่อระบุองค์ประกอบที่ถูกต้องโดยไม่มีเนื้อหาแม้ว่าตามปกติแล้วประเภทเนื้อหาขององค์ประกอบจะไม่อนุญาตให้มีองค์ประกอบที่ว่างเปล่า

หากใช้แท็กเปล่า getElementValue () จะส่งคืนสตริงว่าง ("") หากละเว้นแท็กจะไม่มีแท็กผู้เขียนปรากฏอยู่ สิ่งนี้อาจแตกต่างจากการตั้งค่าเป็น 'ไม่มี' (เช่นการตั้งค่า "ซีรีส์" เป็นศูนย์อาจเป็นไปได้ว่าหนังสือเล่มนี้ไม่มีซีรี่ส์

จาก: W3C

XML Schema: โครงสร้างแนะนำกลไกสำหรับการส่งสัญญาณว่าองค์ประกอบควรได้รับการยอมรับว่าเป็น "ถูกต้อง" เมื่อไม่มีเนื้อหาแม้ว่าจะเป็นประเภทเนื้อหาที่ไม่ต้องการหรือจำเป็นต้องมีเนื้อหาที่ว่างเปล่า องค์ประกอบอาจถูกต้องโดยไม่มีเนื้อหาหากมีแอตทริบิวต์ xsi: nil ที่มีค่าเป็นจริง องค์ประกอบที่มีป้ายกำกับจึงต้องว่างเปล่า แต่สามารถมีแอตทริบิวต์ได้หากได้รับอนุญาตจากประเภทที่ซับซ้อนที่สอดคล้องกัน

การชี้แจง:
หากคุณมีองค์ประกอบ xml หนังสือและหนึ่งในองค์ประกอบของเด็กคือหนังสือ: ซีรีส์คุณมีหลายตัวเลือกเมื่อกรอก:

  1. การลบองค์ประกอบทั้งหมด - สิ่งนี้สามารถทำได้เมื่อคุณต้องการระบุว่าซีรีส์นี้ไม่ได้ใช้กับหนังสือเล่มนี้หรือหนังสือเล่มนั้นไม่ได้เป็นส่วนหนึ่งของซีรี่ส์ ในกรณีนี้การแปลง xsl (หรือตัวประมวลผลอื่น ๆ ตามเหตุการณ์) ที่มีเทมเพลตที่ตรงกับหนังสือ: จะไม่มีการเรียกซีรี่ส์ ตัวอย่างเช่นหาก xsl ของคุณเปลี่ยนองค์ประกอบหนังสือเป็นแถวของตาราง (xhtml: tr) คุณอาจได้รับจำนวนเซลล์ตารางที่ไม่ถูกต้อง (xhtml: td) โดยใช้วิธีนี้
  2. ปล่อยองค์ประกอบว่างไว้ - สิ่งนี้อาจระบุได้ว่าซีรีส์คือ "" หรือไม่เป็นที่รู้จักหรือหนังสือเล่มนั้นไม่ได้เป็นส่วนหนึ่งของซีรี่ส์ การแปลง xsl ใด ๆ (หรือตัวแยกวิเคราะห์อื่น ๆ ที่ไม่เคยมีมาก่อน) ที่ตรงกับหนังสือ: จะมีการเรียกซีรี่ส์ ค่าปัจจุบัน () จะเป็น "" คุณจะได้รับแท็ก xhtml: td จำนวนเท่ากันโดยใช้วิธีนี้เช่นเดียวกับแท็กถัดไปที่อธิบายไว้
  3. การใช้ xsi: nil = "true" - นี่เป็นการแสดงว่าองค์ประกอบหนังสือ: ซีรีย์เป็น NULL ไม่เพียง แต่ว่างเปล่า การแปลง xsl ของคุณ (หรือตัวแยกวิเคราะห์ตามเหตุการณ์อื่น ๆ ) ที่มีหนังสือที่ตรงกับเทมเพลต: ซีรีส์จะถูกเรียก ค่าปัจจุบัน () จะว่างเปล่า (ไม่ใช่สตริงว่าง) ความแตกต่างที่สำคัญระหว่างวิธีนี้และ (2) คือประเภทของหนังสือ: ชุดไม่จำเป็นต้องอนุญาตให้มีสตริงว่าง ("") เป็นค่าที่ถูกต้อง สิ่งนี้ไม่สมเหตุสมผลสำหรับอิลิเมนต์อนุกรม แต่สำหรับอิลิเมนต์ภาษาที่ถูกกำหนดเป็นชนิดที่แจกแจงในสกีมา xsi: nil = "true" อนุญาตให้อิลิเมนต์ไม่มีข้อมูล อีกตัวอย่างหนึ่งคือองค์ประกอบของประเภททศนิยม หากคุณต้องการให้ว่างเปล่าคุณสามารถรวมสตริงที่แจกแจงที่อนุญาตเฉพาะ "" และทศนิยมหรือใช้ทศนิยมที่ไม่สามารถทำได้

11
การใช้ xsi: nil นั้นถูกต้อง แต่คุณควรตรวจสอบให้แน่ใจว่ามันอยู่ในเนมสเปซที่เหมาะสม: xmlns: xsi = " w3.org/2001/XMLSchema-instance "
STW

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"มันเป็นเรื่องจริง บันทึก http: // ที่หายไป เป็นสิ่งสำคัญเนื่องจากสตริงเนมสเปซเป็นจริงเพียงสตริงไปยังตัวแยกวิเคราะห์ xml และไม่ใช่ uri
Burak Arslan

9
ฉันเชื่อว่ามันผิดเล็กน้อย xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"มันควรจะเป็น หมายเหตุ "www." ดูw3.org/TR/xmlschema-1/#no-xsi
Janne Mattila

ตามที่ระบุไว้ในคำตอบของฉันฉันไม่เห็นด้วยกับการตีความเพราะมันไม่ได้เป็นตัวแทนของรัฐขององค์ประกอบ แต่ข้อ จำกัด ในการใช้งานขององค์ประกอบ
Oakcool

2
@ChrisV: ไม่เป็นความจริงxsi:จะต้องประกาศคำนำหน้า ตัวแยกวิเคราะห์ XML ที่ตระหนักถึงเนมสเปซจะปฏิเสธเอกสาร XML ของคุณหากคุณพยายามใช้xsi:คำนำหน้าโดยไม่ต้องประกาศ ข้อมูลจำเพาะที่เกี่ยวข้องที่นี่เป็นw3.org/TR/xml-names/#nsc-NSDeclared ( "Namespace จำกัด : คำนำหน้าประกาศ") ซึ่งกล่าวว่าคำนำหน้ากำหนดไว้ล่วงหน้าเท่านั้นและxml: xmlns:XML Schema สร้างอยู่ด้านบนของข้อมูลจำเพาะ XML เนมสเปซ แต่ไม่ได้เพิ่มส่วนนำหน้าที่กำหนดไว้ล่วงหน้าใด ๆ เพิ่มเติมเนื่องจากการทำเช่นนั้นจะเป็นการละเมิดข้อกำหนด XML เนมสเปซจริง
Simon Kissane

9

ไม่มีคำตอบที่ยอมรับเนื่องจาก XML พื้นฐานไม่มีแนวคิดที่เป็นโมฆะ แต่ฉันคิดว่าคุณต้องการการแมป Xml / Object (เนื่องจากกราฟวัตถุมีโมฆะ); ดังนั้นคำตอบสำหรับคุณคือ "สิ่งที่เครื่องมือของคุณใช้" หากคุณเขียนการจัดการนั่นหมายถึงสิ่งที่คุณต้องการ สำหรับเครื่องมือที่ใช้ XML Schema xsi:nilเป็นวิธีที่จะไป สำหรับผู้ทำแผนที่ส่วนใหญ่การละเว้นองค์ประกอบ / แอตทริบิวต์ที่ตรงกันเป็นวิธีที่ทำได้


8

ขึ้นอยู่กับวิธีการตรวจสอบ XML ของคุณ หากคุณใช้การตรวจสอบความถูกต้องของ XML Schema วิธีที่ถูกต้องในการแสดงnullค่าอยู่กับxsi:nilแอตทริบิวต์

[ ที่มา ]


7

เอกสารในลิงค์ w3

http://www.w3.org/TR/REC-xml/#sec-starttags

บอกว่านี่คือรูปแบบที่แนะนำ

<test></test>
<test/>

คุณลักษณะที่กล่าวถึงในคำตอบอื่น ๆ เป็นกลไกการตรวจสอบและไม่ได้เป็นตัวแทนของรัฐ โปรดดูhttp://www.w3.org/TR/xmlschema-1/#xsi_nil

XML Schema: โครงสร้างแนะนำกลไกสำหรับการส่งสัญญาณว่าองค์ประกอบควรได้รับการยอมรับว่าเป็น "ถูกต้อง"เมื่อไม่มีเนื้อหาแม้ว่าจะเป็นประเภทเนื้อหาที่ไม่ต้องการหรือจำเป็นต้องมีเนื้อหาที่ว่างเปล่า องค์ประกอบอาจถูกต้องโดยไม่มีเนื้อหาหากมีแอตทริบิวต์ xsi: nil ที่มีค่าเป็นจริง องค์ประกอบที่มีป้ายกำกับจึงต้องว่างเปล่าแต่สามารถมีแอตทริบิวต์ได้หากได้รับอนุญาตจากประเภทที่ซับซ้อนที่สอดคล้องกัน

เพื่อชี้แจงคำตอบนี้: เนื้อหา

  <Book>
    <!--Invalid construct since the element attribute xsi:nil="true" signal that the element must be empty-->
    <BuildAttributes HardCover="true" Glued="true" xsi:nil="true">
      <anotherAttribute name="Color">Blue</anotherAttribute>
    </BuildAttributes>
    <Index></Index>
    <pages>
      <page pageNumber="1">Content</page>            
    </pages>
    <!--Missing ISBN number could be confusing and misguiding since its not present-->
  </Book>
</Books>

7
นั่นคือคำแนะนำสำหรับองค์ประกอบที่ว่างเปล่า คุณมีความคิดเห็นที่ว่างเปล่า === ว่างหรือไม่ ฉันเชื่อว่ามีความแตกต่างระหว่างทั้งสองแม้ว่ามันมักจะเป็นสถานการณ์ หากคุณสร้างข้อความที่เหมือนกันฉันขอแนะนำให้พูดถึงอาร์กิวเมนต์ในคำตอบของคุณ
Rob Hruska

1
Empty ไม่เหมือนกับ null; หากเป็นเช่นนั้นคำถามสแต็คโอเวอร์โฟลว์นี้จะไม่ถูกถาม คำตอบนี้ผิด อย่างไรก็ตามโปรแกรมเมอร์ควรพิจารณาว่าตรรกะที่จะอ่าน xml นั้นถูกเตรียมไว้เพื่อจัดการกับองค์ประกอบที่หายไปหรือ xsi: nil; หากไม่เป็นเช่นนั้นอาจจำเป็นต้องใช้หนึ่งในรูปแบบเหล่านี้ นั่นคืออาจจำเป็นต้องสูญเสียความแตกต่างระหว่างอิลิเมนต์ null / หายไปและอิลิเมนต์ว่าง
ToolmakerSteve

@ RobHruska ใช่คุณถูกต้องมันเป็นนิยามขององค์ประกอบที่ว่างเปล่า แต่ถ้าคำนึงถึงนิยาม W3C ที่ชี้โดย KitsuneYMG จะกำหนดว่าองค์ประกอบนั้นต้องเป็นโมฆะและฉันเชื่อว่าการเป็นตัวแทนนั้นเป็นคำจำกัดความของ จากนั้นแท็กการเป็นตัวแทนของสถานะปัจจุบันดังนั้นฉันไม่เห็นด้วยกับคำตอบนั้นและเชื่อว่าการที่ว่างเปล่าเป็นการแสดงที่ดีที่สุดขององค์ประกอบที่เป็นโมฆะ ความคิดนั้นง่ายเพื่อรักษาโครงสร้างที่ดีคุณต้องมีองค์ประกอบทั้งหมดที่จะนำเสนอมิฉะนั้นคุณจะไม่ทราบถึงการมีอยู่ของมันและดังนั้นจึงอาจบิดเบือนความจริง
Oakcool

4

คุณใช้xsi:nilเมื่อความหมายสคีมาของคุณระบุว่าองค์ประกอบมีค่าเริ่มต้นและควรใช้ค่าเริ่มต้นหากองค์ประกอบนั้นไม่มีอยู่ ฉันต้องสมมติว่ามีคนฉลาดที่ประโยคก่อนหน้านี้ไม่ใช่ความคิดที่เลวร้ายอย่างเห็นได้ชัด แต่มันฟังดูแย่มากสำหรับฉัน ทุกรูปแบบ XML ที่ฉันเคยทำงานด้วยแสดงถึงค่า Null โดยการไม่ใส่องค์ประกอบ (หรือคุณลักษณะและขอให้โชคดีในการทำเครื่องหมายคุณลักษณะด้วยxsi:nil)


หากในแอพเผยแพร่เอกสารที่คุณต้องการให้วันที่ในหน้าชื่อเป็นค่าเริ่มต้นเป็นวันที่ปัจจุบันหากองค์ประกอบไม่มีเนื้อหาการละเว้นdateองค์ประกอบทั้งหมดไม่ได้ช่วยอะไรมากเนื่องจากแอพจะไม่มีความคิดว่าอยู่ที่ไหนในหน้าชื่อเรื่องที่คุณต้องการ วันที่ที่จะปรากฏ (ถ้าองค์ประกอบที่ถูกละไว้มีเพียงตำแหน่งเดียวที่เป็นไปได้นี่ไม่ใช่ปัญหา; ในคำศัพท์เอกสารจริงเกือบทุกองค์ประกอบมีสถานที่ที่เป็นไปได้มากมาย)
CM Sperberg-McQueen

4

เพียงละเว้นแอตทริบิวต์หรือองค์ประกอบทำงานได้ดีในข้อมูลที่เป็นทางการน้อยลง

หากคุณต้องการข้อมูลที่ซับซ้อนยิ่งขึ้นสกีมา GML จะเพิ่มแอตทริบิวต์ nilReason เช่น: ในGeoSciML :

  • xsi:nil ด้วยค่า "true" ถูกใช้เพื่อระบุว่าไม่มีค่า
  • nilReasonอาจถูกใช้เพื่อบันทึกข้อมูลเพิ่มเติมสำหรับค่าที่หายไป; นี่อาจเป็นหนึ่งในเหตุผล GML มาตรฐาน (missing, inapplicable, withheld, unknown ) หรือข้อความที่จัดทำโดยother:หรืออาจเป็นลิงก์ URI เพื่ออธิบายรายละเอียดเพิ่มเติม

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

นักวิทยาศาสตร์ยังมีความกังวลเกี่ยวกับสาเหตุที่ข้อมูลหายไป ตัวอย่างเช่นหากข้อมูลถูกทิ้งเนื่องจากเหตุผลด้านคุณภาพพวกเขาอาจต้องการดูข้อมูลที่ไม่ดีดั้งเดิม


2

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

สมมติว่าคุณมีไฟล์ xml จากแอปพลิเคชัน "ReportMaster" เวอร์ชัน 1

ตอนนี้ใน ReportMaster เวอร์ชัน 2 มีการเพิ่มคุณสมบัติเพิ่มเติมอีกซึ่งอาจมีการกำหนดหรือไม่

หากคุณใช้การแทน 'no tag หมายถึง null' คุณจะได้รับความเข้ากันได้ย้อนหลังโดยอัตโนมัติสำหรับการอ่านไฟล์ ReportMaster 1 xml ของคุณ

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