Python ไฟล์ XML – วิธีอ่าน เขียน และแยกวิเคราะห์

⚡ สรุปอย่างชาญฉลาด

Python การประมวลผล XML ช่วยให้คุณอ่าน เขียน และแยกวิเคราะห์เอกสาร XML โดยใช้โมดูล minidom และ ElementTree ที่มีอยู่ภายใน คลาส minidom โหลดไฟล์ลงในหน่วยความจำในรูปแบบ DOM ในขณะที่ ElementTree นำเสนอวิธีการที่รวดเร็วและมีประสิทธิภาพกว่า PythonAPI ของ ic tree

  • 🔘 XML คืออะไร: ภาษา Markup ที่ขยายได้ (Extensible Markup Language) ใช้สำหรับจัดเก็บและส่งข้อมูลขนาดเล็กที่มีโครงสร้าง
  • ☑️ การแยกวิเคราะห์มินิดอม: ฟังก์ชัน parse() จะโหลดไฟล์ XML เข้าสู่หน่วยความจำในรูปแบบ DOM
  • แท็กสำหรับการอ่าน: getElementsByTagName() จะส่งคืนองค์ประกอบที่ตรงกัน ส่วน getAttribute() จะอ่านค่าขององค์ประกอบเหล่านั้น
  • 🧪 โหนดการเขียน: เมธอด createElement() และ appendChild() จะเพิ่มแท็กใหม่ลงในเอกสาร
  • 🛠️ API ของ ElementTree: ET.parse() สร้างโครงสร้างต้นไม้; getroot() ส่งคืนองค์ประกอบราก
  • 🤖 พร้อมสำหรับ AI: การประมวลผล XML จะส่งข้อมูลการกำหนดค่าและข้อมูล API เข้าสู่กระบวนการเรียนรู้ของเครื่อง

Python ไฟล์ XML

หัวข้อด้านล่างนี้จะกล่าวถึงการแยกวิเคราะห์ การเขียน และการอ่านไฟล์ XML Python.

XML คืออะไร?

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

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

วิธีแยกวิเคราะห์ XML โดยใช้ minidom

เราได้สร้างไฟล์ XML ตัวอย่างที่เราจะแยกวิเคราะห์

ขั้นตอนที่ 1) สร้างไฟล์ XML ตัวอย่าง

ภายในไฟล์เราจะเห็นชื่อ นามสกุล บ้าน และพื้นที่ความเชี่ยวชาญ (SQL, Python(การทดสอบและธุรกิจ)

วิธีแยกวิเคราะห์ XML โดยใช้ minidom

ขั้นตอนที่ 2) ใช้ฟังก์ชันแยกวิเคราะห์เพื่อโหลดและแยกวิเคราะห์ไฟล์ XML

เมื่อเราวิเคราะห์เอกสารเสร็จแล้ว เราจะพิมพ์ "ชื่อโหนด" ของรากของเอกสารและ "ชื่อแท็กของโหนดลูกตัวแรก" ออกมา ชื่อแท็กและชื่อโหนดเป็นคุณสมบัติมาตรฐานของไฟล์ XML

แยกวิเคราะห์ XML โดยใช้ minidom

  • นำเข้าโมดูล xml.dom.minidom และประกาศไฟล์ที่จะต้องนำมาประมวลผล (myxml.xml)
  • ไฟล์นี้ประกอบด้วยข้อมูลพื้นฐานเกี่ยวกับพนักงาน เช่น ชื่อ นามสกุล บ้าน ความเชี่ยวชาญ ฯลฯ
  • เราใช้ฟังก์ชันแยกวิเคราะห์บน XML minidom เพื่อโหลดและแยกวิเคราะห์ไฟล์ XML
  • เรามีตัวแปรชื่อ doc และ doc จะได้รับผลลัพธ์จากฟังก์ชัน parse
  • เราต้องการพิมพ์ชื่อโหนดและชื่อแท็กของโหนดลูกจากไฟล์ ดังนั้นเราจึงประกาศตัวแปรเหล่านั้นในฟังก์ชัน print
  • เรียกใช้รหัส - พิมพ์ชื่อโหนด (#document) จากไฟล์ XML และชื่อแท็กย่อยคนแรก (พนักงาน) จากไฟล์ XML

หมายเหตุ: ชื่อโหนดและชื่อแท็กย่อยเป็นชื่อหรือคุณสมบัติมาตรฐานของ XML DOM

ขั้นตอนที่ 3) เรียกดูรายการแท็ก XML จากเอกสาร XML แล้วพิมพ์ออกมา

ถัดไป เรายังสามารถเรียกดูรายการแท็ก XML จากเอกสาร XML และพิมพ์ออกมาได้ ในที่นี้เราได้พิมพ์ชุดทักษะต่างๆ เช่น SQL ออกมา Python, การทดสอบ และธุรกิจ

แยกวิเคราะห์ XML โดยใช้ minidom

  • กำหนดตัวแปร expertise ซึ่งเราจะใช้เป็นตัวอย่างtracความเชี่ยวชาญทั้งหมดที่พนักงานมี
  • ใช้ฟังก์ชันมาตรฐาน dom ที่เรียกว่า "getElementsByTagName"
  • นี่จะได้รับองค์ประกอบทั้งหมดที่มีชื่อว่าทักษะ
  • ประกาศลูปเพื่อวนซ้ำแต่ละแท็กทักษะ
  • รันโค้ด - มันจะแสดงรายการทักษะสี่อย่าง

วิธีการเขียนโหนด XML

เราสามารถสร้างแอตทริบิวต์ใหม่ได้โดยใช้ฟังก์ชัน "createElement" จากนั้นจึงเพิ่มแอตทริบิวต์หรือแท็กใหม่นี้ต่อท้ายแท็ก XML ที่มีอยู่ เราได้เพิ่มแท็กใหม่ “BigData” ในไฟล์ XML ของเรา

  1. คุณต้องเขียนโค้ดเพื่อเพิ่มแอตทริบิวต์ใหม่ (BigData) ลงในแท็ก XML ที่มีอยู่เดิม
  2. จากนั้น คุณต้องพิมพ์แท็ก XML โดยเพิ่มแอตทริบิวต์ใหม่ต่อท้ายแท็ก XML เดิม

เขียนโหนด XML

  • ในการเพิ่มแท็ก XML ใหม่และเพิ่มลงในเอกสาร เราใช้โค้ด “doc.createElement”
  • โค้ดนี้จะสร้างแท็กทักษะใหม่สำหรับแอตทริบิวต์ใหม่ของเราที่ชื่อว่า “BigData”
  • เพิ่มแท็กทักษะนี้ลงในข้อมูลย่อยแรกของเอกสาร (พนักงาน)
  • รันโค้ด - แท็กใหม่ "BigData" จะปรากฏขึ้นพร้อมกับรายการความเชี่ยวชาญอื่นๆ

ตัวอย่างตัวแยกวิเคราะห์ XML

Python 2 ตัวอย่าง

import xml.dom.minidom

def main():
# use the parse() function to load and parse an XML file
   doc = xml.dom.minidom.parse("Myxml.xml");
  
# print out the document node and the name of the first child tag
   print doc.nodeName
   print doc.firstChild.tagName
  
# get a list of XML tags from the document and print each one
   expertise = doc.getElementsByTagName("expertise")
   print "%d expertise:" % expertise.length
   for skill in expertise:
     print skill.getAttribute("name")
    
#Write a new XML tag and add it into the document
   newexpertise = doc.createElement("expertise")
   newexpertise.setAttribute("name", "BigData")
   doc.firstChild.appendChild(newexpertise)
   print " "

   expertise = doc.getElementsByTagName("expertise")
   print "%d expertise:" % expertise.length
   for skill in expertise:
     print skill.getAttribute("name")
    
if name == "__main__":
  main();

Python 3 ตัวอย่าง

import xml.dom.minidom

def main():
    # use the parse() function to load and parse an XML file
    doc = xml.dom.minidom.parse("Myxml.xml");

    # print out the document node and the name of the first child tag
    print (doc.nodeName)
    print (doc.firstChild.tagName)
    # get a list of XML tags from the document and print each one
    expertise = doc.getElementsByTagName("expertise")
    print ("%d expertise:" % expertise.length)
    for skill in expertise:
        print (skill.getAttribute("name"))

    # Write a new XML tag and add it into the document
    newexpertise = doc.createElement("expertise")
    newexpertise.setAttribute("name", "BigData")
    doc.firstChild.appendChild(newexpertise)
    print (" ")

    expertise = doc.getElementsByTagName("expertise")
    print ("%d expertise:" % expertise.length)
    for skill in expertise:
        print (skill.getAttribute("name"))

if __name__ == "__main__":
    main();

วิธีแยกวิเคราะห์ XML โดยใช้ ElementTree

ElementTree คือ API สำหรับจัดการไฟล์ XML ElementTree เป็นวิธีที่ง่ายในการประมวลผลไฟล์ XML

เรากำลังใช้เอกสาร XML ต่อไปนี้เป็นตัวอย่างข้อมูล:

<data>
   <items>
      <item name="expertise1">SQL</item>
      <item name="expertise2">Python</item>
   </items>
</data>

การอ่าน XML โดยใช้ ElementTree:

ก่อนอื่นเราต้องนำเข้าโมดูล xml.etree.ElementTree ก่อน

import xml.etree.ElementTree as ET

ต่อไปเรามาดึงข้อมูลองค์ประกอบรากกัน:

root = tree.getroot()

ต่อไปนี้คือโค้ดฉบับสมบูรณ์สำหรับการอ่านข้อมูล XML ข้างต้น:

import xml.etree.ElementTree as ET
tree = ET.parse('items.xml')
root = tree.getroot()

# all items data
print('Expertise Data:')

for elem in root:
   for subelem in elem:
      print(subelem.text)

Output:

Expertise Data:
SQL
Python

คำถามที่พบบ่อย

สำหรับไฟล์ขนาดเล็กที่ต้องการการนำทาง DOM ให้ใช้ minidom สำหรับงานส่วนใหญ่ ให้เลือก ElementTree เพราะเร็วกว่า เบากว่า และเป็นตัวเลือกที่แนะนำมากกว่า Pythonค่าเริ่มต้นของ ic

ห่อรากด้วย ElementTree แล้วเรียกใช้ tree.write(“out.xml”, encoding=”utf-8″, xml_declaration=True) สำหรับการเยื้อง ให้ใช้ ET.indent() กับ Python 3.9 ขึ้นไป หรือใช้ pretty_print ของ lxml

lxml เป็นไลบรารีจากภายนอกที่ใช้ API ของ ElementTree แต่เขียนด้วยโค้ด C ที่ทำงานได้อย่างรวดเร็ว มันเพิ่มฟังก์ชัน XPath, XSLT และการตรวจสอบความถูกต้อง ติดตั้งได้โดยใช้คำสั่ง pip install lxml

ตัวแยกวิเคราะห์มาตรฐานมีความเสี่ยงต่อการโจมตี XXE และการโจมตีแบบ billion-laughs ติดตั้ง defusedxml และนำเข้า defusedxml.ElementTree ซึ่งเป็นตัวทดแทนที่ใช้งานได้ทันทีและปิดใช้งานเอนทิตีภายนอกที่เป็นอันตราย

ใช่แล้ว ใช้ minidom.parseString(text) หรือ ElementTree's ET.fromstring(text) ซึ่งจะส่งคืนค่ารากโดยตรง ทั้งสองวิธีจะแยกวิเคราะห์ XML จากตัวแปร ดังนั้นจึงไม่จำเป็นต้องบันทึกผลลัพธ์ก่อน

ใช้ ElementTree ในการสำรวจโครงสร้างต้นไม้ โดยสร้างพจนานุกรมจากแท็ก แอตทริบิวต์ และข้อความของแต่ละองค์ประกอบ ไลบรารี xmltodict จะทำการแปลงโดยอัตโนมัติผ่าน xmltodict.parse()

XML จัดเก็บการตั้งค่า คำอธิบายประกอบ และการตอบสนองจาก API ที่ป้อนข้อมูลให้กับโมเดล ป้ายกำกับรูปภาพ Pascal VOC ถูกส่งมาในรูปแบบ XML; ElementTree extracใช้กรอบขอบเขตของพวกเขาสำหรับการฝึกฝน

ใช่แล้ว GitHub Copilot จะเติมคำอัตโนมัติสำหรับรูปแบบ minidom และ ElementTree เช่น ลูป parse() และ findall() อย่างไรก็ตาม ยังคงต้องตรวจสอบชื่อแท็กและการเข้ารหัส และเพิ่ม defusedxml สำหรับอินพุตที่ไม่น่าเชื่อถือ

สรุปโพสต์นี้ด้วย: