John Squirrels
ระดับ
San Francisco

XML ใน Java

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

Java XML คืออะไร

XML ย่อมาจาก eXtensible Markup Language คุณอาจคุ้นเคยกับภาษามาร์กอัปอยู่แล้ว — คุณเคยได้ยิน HTML ซึ่งใช้สร้างหน้าเว็บหรือไม่ :) XML คืออะไร?  - 1HTML และ XML มีลักษณะที่คล้ายกันด้วยซ้ำ:
เอชทีเอ็มแอล 1
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
เอสเอ็มแอล 1
<headline>title</headline>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
HTML 2
<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> มีแอตทริบิวต์ "lang" ซึ่งระบุภาษาที่ใช้ในการบันทึกชื่อรุ่น:
<model lang="en">Scania R 770</model>
ที่นี่เราระบุว่าชื่อนั้นเขียนเป็นภาษาอังกฤษ แท็ก <ราคา> ของเรามีแอตทริบิวต์ "สกุลเงิน"
<price currency="US dollar">150000.00</price>
ที่นี่เราระบุว่าราคาของรถถูกกำหนดเป็นดอลลาร์สหรัฐ ดังนั้น XML จึงมีไวยากรณ์ "อธิบายตนเอง" คุณสามารถเพิ่มข้อมูลใด ๆ ที่คุณต้องการเพื่ออธิบายข้อมูล นอกจากนี้ ที่ด้านบนของไฟล์ คุณสามารถเพิ่มบรรทัดที่ระบุเวอร์ชัน XML และการเข้ารหัสที่ใช้ในการเขียนข้อมูล สิ่งนี้เรียกว่า "อารัมภบท" และมีลักษณะดังนี้:
<?xml version="1.0" encoding="UTF-8"?>
เรากำลังใช้การเข้ารหัส XML เวอร์ชัน 1.0 และ UTF-8 สิ่งนี้ไม่จำเป็น แต่อาจมีประโยชน์หากไฟล์ของคุณใช้ข้อความในภาษาต่างๆ เรากล่าวว่า XML หมายถึง "eXtensible Markup Language" แต่ "extensible" หมายถึงอะไร ซึ่งหมายความว่าเหมาะสำหรับการสร้างวัตถุและไฟล์เวอร์ชันใหม่ของคุณ ตัวอย่างเช่น สมมติว่าเราต้องการเริ่มขายรถจักรยานยนต์ที่ตัวแทนจำหน่ายรถยนต์ของเราด้วย! ที่กล่าวว่าเราต้องการให้โปรแกรมของเรารองรับทั้งสองเวอร์ชันของ <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>
นั่นเป็นวิธีที่ง่ายและเรียบง่ายในการเพิ่มคำอธิบายของรถจักรยานยนต์ในไฟล์ของเรา :) ยิ่งไปกว่านั้น เราไม่จำเป็นต้องมีแท็กย่อยสำหรับรถจักรยานยนต์เช่นเดียวกับรถยนต์ โปรดทราบว่ารถจักรยานยนต์มีองค์ประกอบ <เจ้าของ> ซึ่งแตกต่างจากรถยนต์ สิ่งนี้ไม่ได้ป้องกันคอมพิวเตอร์ (หรือมนุษย์) จากการอ่านข้อมูล

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

เราได้กล่าวไปแล้วว่า XML และ HTML มีลักษณะที่คล้ายคลึงกันมาก นั่นทำให้การรู้ว่าต่างกันอย่างไรจึงสำคัญมาก ประการแรกใช้เพื่อวัตถุประสงค์ที่แตกต่างกัน HTML ใช้สำหรับทำเครื่องหมายหน้าเว็บ ตัวอย่างเช่น ขณะสร้างเว็บไซต์ คุณสามารถใช้ HTML เพื่อระบุ: "เมนูควรอยู่ที่มุมขวาบน ควรมีปุ่มดังกล่าวและดังกล่าว" กล่าวอีกนัยหนึ่ง หน้าที่ของ HTML คือการแสดงข้อมูล XML ใช้สำหรับจัดเก็บและส่งข้อมูลในรูปแบบที่สะดวกสำหรับมนุษย์และคอมพิวเตอร์ รูปแบบนี้ไม่มีข้อบ่งชี้ว่าข้อมูลนี้ควรแสดงอย่างไร ซึ่งขึ้นอยู่กับรหัสของโปรแกรมที่อ่าน ประการที่สอง มีความแตกต่างทางเทคนิคที่สำคัญ แท็ก HTML ถูกกำหนดไว้ล่วงหน้า กล่าวอีกนัยหนึ่ง การสร้างส่วนหัว HTML (ตัวอย่างเช่น คำอธิบายภาพขนาดใหญ่ที่ด้านบนของหน้า) ใช้แท็ก <h1></h1> เท่านั้น (<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>
ตอนนี้โปรแกรมของเราจะสามารถแยกความแตกต่างระหว่างเอนทิตีต่างๆ ได้! ทุกอย่างที่มีคำนำหน้าของเล่นจะถือว่าเป็นของเล่น :) อย่างไรก็ตาม เรายังไม่เสร็จสิ้น หากต้องการใช้คำนำหน้า เราจำเป็นต้องลงทะเบียนแต่ละคำเป็นเนมสเปซ จริงๆ แล้วคำว่า "register" เป็นคำที่แรง :) เราแค่ต้องคิดชื่อเฉพาะสำหรับแต่ละอัน มันเหมือนกับคลาส: คลาสมีชื่อสั้น ( 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" แต่สตริงนี้มีข้อมูลที่เป็นประโยชน์: นักพัฒนากลุ่ม 1 ในแผนก 2 มีหน้าที่สร้างเนมสเปซ "จริง" . หากเราจำเป็นต้องแนะนำชื่อใหม่หรือหารือเกี่ยวกับข้อขัดแย้งที่อาจเกิดขึ้น เราจะรู้ว่าควรหันไปทางไหน บางครั้งนักพัฒนาซอฟต์แวร์ใช้ที่อยู่เว็บที่สื่อความหมายเป็นชื่อเนมสเปซที่ไม่ซ้ำใคร ตัวอย่างเช่น อาจเป็นกรณีของบริษัทขนาดใหญ่ที่มีโครงการที่จะใช้โดยผู้คนหลายล้านคนทั่วโลก แต่สิ่งนี้ไม่ได้เกิดขึ้นเสมอไป: Stack Overflowมีการอภิปรายเกี่ยวกับปัญหานี้ โดยทั่วไป ไม่มีข้อกำหนดที่เข้มงวดในการใช้ 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>
ข้อผิดพลาด! "ไม่อนุญาตให้ใช้องค์ประกอบ mainhero ที่นี่" มีมาตรฐาน XML อื่น ๆ อีกมากมาย คุณสามารถทำความคุ้นเคยกับแต่ละรายการและพยายามเจาะลึกลงไปในรหัส อย่างไรก็ตาม หากคุณต้องการข้อมูลเกี่ยวกับ XML คุณสามารถค้นหาได้เกือบทุกอย่างที่นั่น :) และด้วยเหตุนี้ บทเรียนของเราก็จบลง ได้เวลากลับไปทำภารกิจแล้ว! :) จนกว่าจะถึงครั้งต่อไป!
ความคิดเห็น
  • เป็นที่นิยม
  • ใหม่
  • เก่า
คุณต้องลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
หน้านี้ยังไม่มีความคิดเห็นใด ๆ