ข้อดีของ XML บนสัญกรณ์ S-expressions (-ish) คืออะไร


11

ฉันต้องการถามคำถามเกี่ยวกับสัญกรณ์ XML และ S-expressions (-ish) S-expressions ค่อนข้างเก่า พวกเขายังง่ายจริงๆ เราสามารถพิจารณาสองรูปแบบที่เท่ากันในความหมายแตกต่างกันในไวยากรณ์:

(รหัส xml นำมาจากวิกิพีเดียภาษาโปแลนด์ )

<?xml version="1.0" encoding="UTF-8"?>
<ksiazka-telefoniczna kategoria="bohaterowie książek">
 <!-- komentarz -->
  <osoba charakter="dobry">
    <imie>Ambroży</imie>
    <nazwisko>Kleks</nazwisko>
    <telefon>123-456-789</telefon>
  </osoba>
  <osoba charakter="zły">
    <imie>Alojzy</imie>
    <nazwisko>Bąbel</nazwisko>
    <telefon/>
  </osoba>
</ksiazka-telefoniczna>

รุ่น S-Expression (-ish):

(:version "1.0" :encoding "utf-8")
(ksiazka-telefoniczna :category "bohaterowie książek"
  ; komentarz(a comment)
  (osoba :charakter "dobry"
    (imie Ambroży)
    (nazwisko Kleks)
    (telefon 123-456-789))
  (osoba :charakter "zły"
    (imie Alojzy)
    (nazwisko Bąbel)
    (telefon)))

รุ่น S-Expression นั้นกระชับกว่านี้มาก เราหลีกเลี่ยงความซ้ำซ้อนโดยใช้สัญลักษณ์รายการแบบง่าย แต่เรายังสามารถกำหนดไวยากรณ์เพื่อรวมสิ่งที่เราต้องการได้ (เช่นคุณสมบัติ) แน่นอนว่านี่เป็นเพียงตัวอย่างและมาตรฐานจริงอาจดีกว่าหรือแตกต่าง อย่างไรก็ตามมันสั้นและง่ายกว่าในการแยกวิเคราะห์ ทำไม XML ถึงชนะ



5
หากต้องการ downvoters: อย่า downvote หากคุณไม่เห็นด้วยกับคำถาม แต่ถ้าคุณคิดว่าคุณภาพต่ำ (จากนั้นให้เสนอการเปลี่ยนแปลงเพื่อปรับปรุงคุณภาพ) @RobertHarvey หากคุณคิดว่ามันเป็นคำตอบโปรดตอบคำถามของฉันแทนการทิ้งความคิดเห็น
MatthewRock

1
เคล็ดลับเครื่องมือบนปุ่ม downvote นั้นมีวลี "คำถามนี้ไม่ได้แสดงความพยายามในการวิจัย"
Robert Harvey

1
พยายามจำว่านี่ไม่ใช่กระดานสนทนา คำถามจริงมีคำตอบและสมาชิกชุมชนคาดหวังที่จะให้คำตอบไม่ใช่ความคิดเห็น
Robert Harvey

1
อาร์กิวเมนต์ความซ้ำซ้อนสำหรับ XML (เช่นมีวงเล็บปิดที่มีชื่อของวงเล็บเปิด) สามารถเลียนแบบได้อย่างง่ายดายโดย S-expressions (para "This is a paragraph " (footnote "(better than the one under there)" "." /footnote) /para)เพียงแค่เขียน
แอนดรู

คำตอบ:


13

เรารู้ว่านักออกแบบ XML มีความคุ้นเคยกับ S-expressions เนื่องจาก XML อิงกับ SGML และ SGML มีภาษาสไตล์ชีท DSSSL ซึ่งใช้ไวยากรณ์ S-expression (และโครงร่างเป็นภาษาสคริปต์แบบฝัง)

อย่างไรก็ตามพวกเขาเลือกไวยากรณ์ที่แตกต่างจาก S-expressions เนื่องจากกรณีการใช้งานสำหรับ XML เริ่มแรกถูกออกแบบมาเพื่อรองรับทั้งโครงสร้างข้อมูลที่สร้างด้วยเครื่องจักรและภาษามาร์กอัปเช่น HTML ซึ่งเขียนด้วยตนเองและมีเนื้อหาแบบผสม (ข้อความผสมกับองค์ประกอบที่มีเมทาดาทา)

ความฟุ่มเฟือย

เอกสารข้อความมาร์กอัปมักจะยาวกว่าหน้าจอ หากคุณเห็น)และคุณไม่สามารถเห็นจุดเริ่มต้นของโครงสร้างคุณจะหลงทาง คุณไม่รู้ว่าเป็นบทหรือแถบด้านข้างที่เพิ่งจบลงไหม ความซ้ำซ้อนของการซ้ำชื่อแท็กในเอนด์แท็กใน XML อย่าง</sidebar>นี้ทำให้ผู้เขียนมนุษย์ง่ายขึ้นมาก นอกจากนี้ยังทำให้มีประสิทธิภาพมากขึ้น: หากคุณลบแท็กปิดท้ายโดยไม่ตั้งใจคุณสามารถสรุปได้ว่าแท็กปิดท้ายใดหายไป

SGML (ผู้บุกเบิกไปยัง XML) อนุญาตให้คุณเลือกที่จะย่อแท็กปิดท้ายให้เหลือเพียงอักขระเดียว แต่คุณลักษณะนี้ไม่ได้อยู่ใน XML เพื่อความง่าย

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

เนื้อหาผสม

ไวยากรณ์ที่คุณแนะนำจะไม่สนับสนุนเนื้อหาแบบผสมอย่างดี นำตัวอย่างนี้เป็น HTML:

<p>Hi! <a href="example.com">Click here</a>!</p>

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

ตัวละครพิเศษ

วงเล็บมุมมีความยากในข้อความธรรมดามากกว่าวงเล็บและโคลอน

ความเข้ากันได้

HTML นั้นประสบความสำเร็จอย่างมากในขณะที่ XML ได้รับการออกแบบมาและเหมาะสมที่จะเลือกไวยากรณ์ที่คล้ายกัน

ทำไม XML ถึงชนะ

S-expression ไม่เคยเป็นทางเลือกของ XML สเป็ค XML นั้นมากกว่าวงเล็บมุม มันกำหนดไวยากรณ์สำหรับองค์ประกอบและคุณสมบัติและเนื้อหาผสมหนีการเข้ารหัสตัวอักษรไวยากรณ์ DTD และการตรวจสอบและอื่น ๆ ไม่มีสิ่งใดที่คล้ายกันสำหรับ s-expressions แน่นอนคุณสามารถกำหนดมาตรฐานที่คล้ายกันตามที่คุณเสนอที่นี่ แต่ไม่มีใครทำเช่นนี้ในเวลา XML ได้รับพรจาก W3C และได้รับการรับรองจากผู้เล่นรายใหญ่และกลายเป็นมาตรฐานในการแลกเปลี่ยนข้อมูล


3
ในตัวอย่างของเขาไม่ใช้โคลอนสำหรับแอตทริบิวต์ เช่น. (p Hi! (a: href "example.com" คลิกที่นี่)!)? (หรือเขาเพิ่งแก้ไขที่ในหลังจากคำตอบของคุณถูกโพสต์?)
Headcrab

แม้ว่าจะไม่ได้ทำอะไรจากคำตอบ (ยอดเยี่ยม) ของคุณใครที่อยู่ในใจของพวกเขาสร้างเอกสาร XML ด้วยตนเอง ?
Jared Smith

เฮ้ Jacques ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมนี้! ฉันเห็นด้วยกับ Headcrab ว่าเนื้อหาแบบผสมไม่ใช่ปัญหา ฉันเห็นด้วยกับ Jared แม้ว่าฉันเดาว่า XML จะอ่าน / เขียนด้วยตนเองในบางครั้ง
MatthewRock

@Headcrab: มันยากที่จะพูดเนื่องจากไม่มีสเป็คจริงเพียงแค่ตัวอย่างสมมุติ แต่ดูเหมือนว่าฉันที่แสดงข้อความเป็นสัญลักษณ์แทนที่จะเป็นสตริงที่อ้างถึงจะนำไปสู่ความคลุมเครือที่มีช่องว่าง S-expressions ไม่สนับสนุนช่องว่างที่สำคัญระหว่างอะตอม AFAIK แต่คุณต้องการสิ่งนี้เพื่อสนับสนุนเช่น<PRE>องค์ประกอบใน HTML ดังนั้นฉันคิดว่าคำพูดจะต้อง
JacquesB

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

9

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

เท่าที่ฉันรู้ว่าไม่มีใครทำที่ใดก็ได้ใกล้เคียงกับความพยายามที่จะสร้างมาตรฐานโครงสร้างกลไกวัตถุประสงค์ทั่วไปสำหรับการแสดงออก s ยกเว้นภาษา LISP เอง (ซึ่งตัวอย่างในคำถามของ OP ไม่ได้ใช้)


1
แม้ว่าฉันจะไม่ชอบคำฟุ่มเฟื่อยของ XML แต่ +1 สำหรับการพูดถึงความสามารถของสคีมาซึ่งเกือบจะทำให้มันคุ้มค่า :-)
user949300


1

ต่อไปนี้เป็นสองเหตุผลที่ฉันจะเลือก XML สำหรับบางสิ่ง "S-expression-ish":

รูปแบบวากยสัมพันธ์และความหมายที่กำหนดไว้อย่างดี

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

คุณสามารถกำหนดโมเดลดังกล่าวที่ด้านบนของ S-expressions ทั่วไป ตัวอย่างของคุณแสดงแบบแผนสำหรับการจัดประเภทแอตทริบิวต์และองค์ประกอบลูก เพิ่มความหมายของข้อความความคิดเห็นและคำแนะนำในการประมวลผลและคุณจะมีสิ่งที่ isomorphic ด้วย XML

การขับรถ

จากรูปแบบวากยสัมพันธ์และความหมายมาตรฐานคุณสามารถสร้างเครื่องมือ - และผู้คนจำนวนมากมี คุณสามารถค้นหาโปรเซสเซอร์ XML parser / serializer, XPath และ XSLT บางรูปแบบสำหรับทุกภาษา / แพลตฟอร์มทั่วไป และคุณรู้ว่าพวกเขาทั้งหมดจะทำงานในลักษณะเดียวกันในทุกแพลตฟอร์ม


และนี่คือสิ่งอื่น ๆ ที่ควรพิจารณา:

ในรูปแบบที่ยิ่งใหญ่ XML ไม่ได้เป็นอย่างนั้น

ในตัวอย่างของคุณคุณกำจัดอะไรไปจริง ๆ เมื่อฉันอ่านมันคุณจะ:

  • กำจัดแท็กปิดสำหรับแต่ละนิพจน์
  • กำจัดสิ่ง>ที่ปกติจะแยกแท็กเปิดออกจากลูกของมัน
  • แทนที่ส่วน=ที่คั่นชื่อและค่าของแอตทริบิวต์ด้วย a :เพื่อระบุว่าชายด์เป็นแอททริบิวต์ ไม่มีเงินออม

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

"ความฟุ่มเฟื่อย" เป็นปัญหาจริงหรือไม่?

ฉันคิดว่าคำถามจริงไม่ใช่ว่า XML เป็น "verbose" แต่การแสดงออกนั้นเกินความต้องการสำหรับวัตถุประสงค์ที่กำหนดหรือไม่ ตัวอย่างบางส่วน:

  • ความสามารถสำหรับองค์ประกอบในการเก็บแอตทริบิวต์ซึ่งมีความหมายแตกต่างจากองค์ประกอบย่อย มีประโยชน์สำหรับข้อมูลนอกวงเช่นการอธิบายชนิดข้อมูลเนทิฟของเนื้อหาขององค์ประกอบ แต่คุณอาจไม่ต้องการมันเพราะสเป็คภายนอกของคุณกำหนดเนื้อหา
  • เนื้อหาแบบผสมซึ่งองค์ประกอบสามารถเก็บทั้งองค์ประกอบลูกและข้อความ (เช่นเดียวกับความคิดเห็นและคำแนะนำในการประมวลผล) มีประโยชน์สำหรับมาร์กอัป แต่อาจไม่ใช่การแสดงข้อมูลอย่างง่าย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.