JavaRush /จาวาบล็อก /Random-TH /XML ใน Java: มันคืออะไร?

XML ใน Java: มันคืออะไร?

เผยแพร่ในกลุ่ม
สวัสดี! วันนี้เราจะมาทำความรู้จักกับรูปแบบข้อมูลอื่นที่เรียกว่า XML นี่เป็นหัวข้อที่สำคัญมาก เมื่อทำงานกับแอปพลิเคชัน Java จริง คุณมักจะประสบปัญหาเกี่ยวกับ XML อย่างแน่นอน รูปแบบนี้ใช้เกือบทุกที่ในการพัฒนา Java (เราจะดูว่าทำไมด้านล่าง) ดังนั้นฉันขอแนะนำให้คุณอ่านการบรรยายไม่ใช่แบบ "แนวทแยง" แต่เข้าใจทุกอย่างอย่างถี่ถ้วนและในขณะเดียวกันก็ศึกษาวรรณกรรม/ลิงก์เพิ่มเติม :) เวลาจะไม่สูญเปล่าอย่างแน่นอน เรามาเริ่มกันด้วยสิ่งง่ายๆ - "อะไร" และ "ทำไม"!

XML คืออะไร?

XML ย่อมาจาก eXtensible Markup Language คุณอาจคุ้นเคยกับภาษามาร์กอัปภาษาใดภาษาหนึ่งอยู่แล้ว: คุณเคยได้ยินเกี่ยวกับ HTML ซึ่งใช้ในการสร้างหน้าเว็บ :) XML คืออะไร - 1HTML และ XML มีลักษณะคล้ายกันด้วยซ้ำ:
HTML1
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML1
<headline>title</headline>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
HTML2
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
เอ็กซ์เอ็มแอล 2
<chief>title</chief>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
กล่าวอีกนัยหนึ่ง XML เป็นภาษาสำหรับการอธิบายข้อมูล

เหตุใดจึงจำเป็นต้องมี XML?

เดิมที XML ได้รับการคิดค้นขึ้นเพื่อการจัดเก็บและการส่งข้อมูลที่สะดวกยิ่งขึ้น รวมถึงทางอินเทอร์เน็ต มีข้อดีหลายประการที่ช่วยให้สามารถรับมือกับงานนี้ได้สำเร็จ ประการแรก ทั้งมนุษย์และคอมพิวเตอร์สามารถอ่านได้ง่าย ฉันคิดว่าคุณสามารถเข้าใจได้ง่ายว่าไฟล์ xml นี้อธิบายอะไร:
<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
คอมพิวเตอร์ยังเข้าใจรูปแบบนี้ได้อย่างง่ายดาย ประการที่สอง เนื่องจากข้อมูลถูกจัดเก็บในรูปแบบข้อความธรรมดา จึงไม่มีปัญหาความเข้ากันได้เมื่อถ่ายโอนจากคอมพิวเตอร์เครื่องหนึ่งไปยังอีกเครื่องหนึ่ง สิ่งสำคัญคือต้องเข้าใจว่าXML ไม่ใช่โค้ดที่ปฏิบัติการได้ แต่เป็นภาษาคำอธิบายข้อมูล หลังจากที่คุณอธิบายข้อมูลโดยใช้ XML แล้ว คุณจะต้องเขียนโค้ด (เช่น ใน Java) ที่สามารถส่ง/รับ/ประมวลผลข้อมูลนี้ได้

XML ทำงานอย่างไร?

องค์ประกอบหลักคือแท็ก สิ่งเหล่านี้คือสิ่งที่อยู่ในวงเล็บมุม:
<book>
</book>
มีแท็กเปิดและปิด สัญลักษณ์ปิดมีสัญลักษณ์เพิ่มเติม - “ /” ซึ่งสามารถดูได้ในตัวอย่างด้านบน แท็กเปิดแต่ละแท็กจะต้องมีแท็กปิดที่สอดคล้องกัน โดยจะแสดงคำอธิบายของแต่ละองค์ประกอบในไฟล์ที่เริ่มต้นและสิ้นสุด แท็กซ้อนกันได้! ใน ตัวอย่างหนังสือของเรา แท็ก<book>มีแท็กย่อย 3 แท็ก - <title> , <author>และ<year> ซึ่งไม่ได้จำกัดอยู่เพียงระดับเดียว แท็กย่อยสามารถมีแท็กย่อยของตัวเองได้ ฯลฯ การออกแบบนี้เรียกว่าแผนผังแท็ก ลองดูแผนผังโดยใช้ตัวอย่างไฟล์ XML พร้อมคำอธิบายของตัวแทนจำหน่ายรถยนต์:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
เรามีแท็กระดับบนสุด- <carstore> เรียกอีกอย่างว่า "รูท" - แท็กรูท <carstore> มีแท็กย่อยหนึ่งแท็ก <car> ในทางกลับกัน <car> ยังมีแท็กลูกของตัวเอง 3 แท็ก - <model>, <year> และ <price> แต่ละแท็กสามารถมีแอตทริบิวต์ได้ - ข้อมูลสำคัญเพิ่มเติม ในตัวอย่างของเรา แท็ก <model> มีแอตทริบิวต์ “lang” ซึ่งเป็นภาษาที่ใช้เขียนชื่อของโมเดล:
<model lang="en">Scania R 770</model>
วิธีนี้ทำให้เราสามารถระบุได้ว่าชื่อเรื่องเขียนเป็นภาษาอังกฤษ แท็ก <price> ของเรามีแอตทริบิวต์ "currency"
<price currency="US dollar">150000.00</price>
วิธีนี้ช่วยให้เราระบุได้ว่าราคารถยนต์เป็นดอลลาร์สหรัฐ ดังนั้นXML จึงมีไวยากรณ์ "อธิบายตัวเอง " คุณสามารถเพิ่มข้อมูลใดๆ ที่คุณต้องการเพื่ออธิบายข้อมูลได้ คุณยังสามารถเพิ่มบรรทัดที่จุดเริ่มต้นของไฟล์เพื่อระบุเวอร์ชัน XML และการเข้ารหัสที่ใช้เขียนข้อมูลได้ เรียกว่า " prolog " และมีลักษณะดังนี้:
<?xml version="1.0" encoding="UTF-8"?>
เราใช้การเข้ารหัส XML เวอร์ชัน 1.0 และ UTF-8 สิ่งนี้ไม่จำเป็น แต่จะมีประโยชน์หากคุณใช้ข้อความในภาษาอื่นในไฟล์ของคุณ เราได้กล่าวไว้แล้วว่า XML ย่อมาจาก “ภาษามาร์กอัปที่ขยายได้” แต่ “ภาษาที่ขยายได้” หมายความว่าอย่างไร ซึ่งหมายความว่าเหมาะอย่างยิ่งสำหรับการสร้างอ็อบเจ็กต์และไฟล์เวอร์ชันใหม่ เช่น เราอยากให้โชว์รูมรถของเราเริ่มขายมอเตอร์ไซค์ด้วย! ในเวลาเดียวกัน ในโปรแกรมเราต้องรองรับ <carstore> ทั้งสองเวอร์ชัน - ทั้งเวอร์ชันเก่า (ไม่มีมอเตอร์ไซค์) และเวอร์ชันใหม่ นี่คือเวอร์ชันเก่าของเรา:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
และนี่คืออันใหม่ที่ขยายเพิ่ม:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
เราเพิ่มคำอธิบายของรถจักรยานยนต์ลงในไฟล์ของเราอย่างง่ายดายและง่ายดาย :) ในเวลาเดียวกัน เราไม่จำเป็นต้องตั้งค่าแท็กย่อยสำหรับรถจักรยานยนต์เหมือนกับรถยนต์เลย โปรดทราบว่ารถจักรยานยนต์มีองค์ประกอบ <owner> ซึ่งต่างจากรถยนต์ นั่นคือเจ้าของ สิ่งนี้จะไม่ป้องกันคอมพิวเตอร์ (หรือบุคคล) จากการอ่านข้อมูล

ความแตกต่างระหว่าง XML และ HTML

เราได้กล่าวไปแล้วว่า XML และ HTML มีลักษณะคล้ายกันมาก ดังนั้นจึงเป็นเรื่องสำคัญมากที่จะต้องรู้ว่ามันแตกต่างกันอย่างไร ประการแรกใช้เพื่อวัตถุประสงค์ที่แตกต่างกัน HTML - สำหรับการมาร์กอัปหน้าเว็บ ตัวอย่างเช่น หากคุณต้องการสร้างเว็บไซต์ โดยใช้ HTML คุณสามารถระบุ: “เมนูควรอยู่ที่มุมขวาบน มันควรจะมีปุ่มแบบนั้น” กล่าวอีกนัยหนึ่ง วัตถุประสงค์ของ HTML คือการแสดงข้อมูล XML - สำหรับจัดเก็บและส่งข้อมูลในรูปแบบที่สะดวกสำหรับมนุษย์และคอมพิวเตอร์ รูปแบบนี้ไม่มีคำแนะนำเกี่ยวกับวิธีการแสดงข้อมูลนี้: ขึ้นอยู่กับโค้ดของโปรแกรมเอง ประการที่สอง พวกเขามีความแตกต่างทางเทคนิคที่สำคัญ แท็ก HTML ถูกกำหนดไว้ล่วงหน้า กล่าวอีกนัยหนึ่ง ในการสร้างส่วนหัว (เช่น คำจารึกขนาดใหญ่ที่จุดเริ่มต้นของหน้า) จะใช้เฉพาะแท็ก <h1></h1> ใน HTML (สำหรับส่วนหัวที่เล็กกว่า - <h2></h2>, < h3></h3>) คุณจะไม่สามารถสร้างส่วนหัวใน HTML โดยใช้แท็กที่มีชื่อต่างกันได้ XML ไม่ได้ใช้แท็กที่กำหนดไว้ล่วงหน้า คุณสามารถตั้งชื่อแท็กได้ตามต้องการ - <header>, <title>, <idontknow2121>

แก้ปัญหาความขัดแย้ง

ความอิสระที่ XML มอบให้อาจทำให้เกิดปัญหาบางอย่างได้ ตัวอย่างเช่น โปรแกรมสามารถใช้เอนทิตีเดียวกัน (เช่น รถยนต์) เพื่อวัตถุประสงค์ที่แตกต่างกันได้ ตัวอย่างเช่น เรามีไฟล์ XML ที่อธิบายเครื่องจักร อย่างไรก็ตามโปรแกรมเมอร์ของเราไม่ได้ตกลงกันไว้ล่วงหน้า และตอนนี้นอกจากข้อมูลจากรถจริงแล้ว xml ของเรายังรวมข้อมูลจากโมเดลของเล่นด้วย! นอกจากนี้พวกเขายังมีคุณลักษณะที่เหมือนกันอีกด้วย โปรแกรมของเราได้รับไฟล์ XML ดังต่อไปนี้ เราจะแยกแยะรถจริงจากโมเดลของเล่นได้อย่างไร?
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
คำนำหน้าและเนมสเปซจะช่วยเราที่นี่ ในการแยกรถของเล่นออกจากรถจริงในโปรแกรมของเรา (และโดยทั่วไปแล้ว ของเล่นใดๆ ก็ตามจากรถต้นแบบจริง) เราแนะนำคำนำหน้าสองคำ - "ของจริง" และ "ของเล่น"
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
ตอนนี้โปรแกรมของเราจะสามารถแยกแยะระหว่างเอนทิตีได้! อะไรก็ตามที่มีคำนำหน้าของเล่นจะถูกจัดประเภทเป็นของเล่น :) อย่างไรก็ตาม เรายังไม่เสร็จสิ้น หากต้องการใช้คำนำหน้า เราจำเป็นต้องลงทะเบียนแต่ละรายการเป็นเนมสเปซ ที่จริงแล้ว "ลงทะเบียน" เป็นคำที่แข็งแกร่ง :) คุณเพียงแค่ต้องตั้งชื่อที่ไม่ซ้ำกันสำหรับแต่ละรายการ มันเหมือนกับคลาส: คลาสมีชื่อสั้น ( Cat) และชื่อเต็มพร้อมแพ็คเกจทั้งหมด ( zoo.animals.Cat) ในการสร้างเนมสเปซที่ไม่ซ้ำใคร โดยปกติจะ ใช้URI บางครั้งที่อยู่อินเทอร์เน็ตจะถูกแทนที่ที่นี่ โดยมีการอธิบายฟังก์ชันและวัตถุประสงค์ของเนมสเปซนี้โดยละเอียด แต่นี่ไม่จำเป็นต้องเป็นที่อยู่อินเทอร์เน็ตที่ถูกต้อง บ่อยครั้งที่โปรเจ็กต์ใช้สตริงที่คล้าย URI ที่ช่วยติดตามลำดับชั้นของเนมสเปซ นี่คือตัวอย่าง:
<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
แน่นอนว่าไม่มีไซต์บนอินเทอร์เน็ตตามที่อยู่http://testproject.developersgroup1.companyname/department2/namespaces/real แต่มีข้อมูลที่เป็นประโยชน์: กลุ่มนักพัฒนา “developersgroup1” จากแผนก “department2” มีหน้าที่สร้าง เนมสเปซ "ของจริง" หากคุณต้องการเพิ่มชื่อใหม่ หรือหารือเกี่ยวกับข้อขัดแย้งที่อาจเกิดขึ้นกับชื่อเหล่านั้น เราทราบดีว่าจะหันไปทางไหน บางครั้งที่อยู่อินเทอร์เน็ตจริงที่มีคำอธิบายของเนมสเปซนี้จะถูกใช้เป็นชื่อเฉพาะสำหรับเนมสเปซ เช่น หากเป็นบริษัทขนาดใหญ่และโครงการของบริษัทจะมีผู้คนหลายล้านคนทั่วโลกนำไปใช้ แต่ สิ่งนี้ไม่ได้เกิดขึ้นเสมอไป: มีการพูดคุยถึงปัญหานี้ในStackoverflow โดยหลักการแล้ว ข้อกำหนดในการใช้ URI เป็นชื่อของเนมสเปซนั้นไม่ได้เข้มงวด: คุณสามารถใช้สตริงสุ่มได้ ตัวเลือกนี้จะใช้งานได้เช่นกัน:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
แต่การใช้ URI มีข้อดีหลายประการ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ ที่นี่

มาตรฐาน XML พื้นฐาน

มาตรฐาน XML คือชุดส่วนขยายที่เพิ่มฟังก์ชันการทำงานเพิ่มเติมให้กับไฟล์ xml XML มีมาตรฐานมากมาย แต่เราจะดูมาตรฐานที่สำคัญที่สุดและดูว่ามาตรฐานเหล่านี้อนุญาตให้ AJAXซึ่งเป็นหนึ่งในมาตรฐาน XML ที่มีชื่อเสียงที่สุดทำอะไรได้บ้าง ช่วยให้คุณสามารถเปลี่ยนเนื้อหาของหน้าเว็บได้โดยไม่ต้องโหลดซ้ำ! ฟังดูดีนะ? :) คุณสามารถลองใช้เทคโนโลยีนี้ด้วยตนเองได้ที่ นี่ XSLT - อนุญาตให้คุณแปลงข้อความ XML เป็นรูปแบบอื่น ตัวอย่างเช่น เมื่อใช้ XSLT คุณสามารถแปลง XML เป็น HTML ได้! วัตถุประสงค์ของ XML ดังที่เราได้กล่าวไปแล้ว คือการอธิบายข้อมูล ไม่ใช่เพื่อแสดงข้อมูล แต่การใช้ XSLT เราสามารถข้ามข้อจำกัดนี้ได้! นี่คือแซนด์บ็อกซ์พร้อมตัวอย่างการทำงาน ซึ่งคุณสามารถดูวิธีการทำงานได้ด้วยตัวเอง :) XML DOM - อนุญาตให้คุณรับ เปลี่ยนแปลง เพิ่มหรือลบองค์ประกอบแต่ละรายการออกจากไฟล์ XML นี่เป็นตัวอย่างเล็กๆ น้อยๆ ของวิธีการทำงาน เรามีไฟล์ books.xml:
<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
มีหนังสือสองเล่มอยู่ในนั้น หนังสือมีองค์ประกอบเช่นชื่อ - <title> และที่นี่เราสามารถใช้ JavaScript เพื่อรับหนังสือทั้งหมดจากไฟล์ XML ของเราและส่งออกหนังสือเล่มแรกไปยังคอนโซล:
<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
ฉันขอแนะนำให้ดูตัวอย่างนี้ทำงานอย่างไรโดยใช้แซนด์บ็อกซ์ :) DTD (“คำจำกัดความประเภทเอกสาร”) - ช่วยให้คุณกำหนดรายการองค์ประกอบที่อนุญาตสำหรับเอนทิตีบางอย่างในไฟล์ XML ตัวอย่างเช่น เรากำลังดำเนินการในเว็บไซต์ร้านหนังสือ และทีมพัฒนาทั้งหมดได้ตกลงกันว่าสำหรับองค์ประกอบของหนังสือ ควรระบุเฉพาะชื่อ ผู้แต่ง และปีในไฟล์ XML แต่เราจะป้องกันตนเองจากการไม่ตั้งใจได้อย่างไร? ง่ายมาก!
<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
ที่นี่เราได้กำหนดรายการแอตทริบิวต์ที่ถูกต้องสำหรับ <book> ลองเพิ่มองค์ประกอบใหม่ที่นั่นแล้วคุณจะได้รับข้อผิดพลาดทันที!
<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
ข้อผิดพลาด! “ไม่อนุญาตให้ใช้ Element mainhero ที่นี่” มีมาตรฐาน XML อื่นๆ อีกมากมาย คุณสามารถทำความคุ้นเคยกับแต่ละรายการและลองเจาะลึกโค้ดบนเว็บไซต์ WC3 (ส่วน “มาตรฐาน XML ที่สำคัญ”) และโดยทั่วไปหากคุณต้องการข้อมูลเกี่ยวกับ XML คุณจะพบเกือบทุกอย่างที่นั่น :) การบรรยายของเราสิ้นสุดลงแล้ว ได้เวลากลับไปทำหน้าที่แล้ว! :) พบกันใหม่!
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION