วิธีอ่านและเขียนไฟล์ XML ด้วย Code

วิธีอ่านและเขียนไฟล์ XML ด้วย Code

คุณต้องการเรียนรู้วิธีอ่านและเขียนไฟล์ XML จาก java หรือไม่?





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





Java Standard Edition (SE) ประกอบด้วย Java API สำหรับการประมวลผล XML (JAXP) ซึ่งเป็นคำศัพท์ในร่มที่ครอบคลุมทุกแง่มุมของการประมวลผล XML ซึ่งรวมถึง:





  • คำพิพากษา: Document Object Model มีคลาสสำหรับการทำงานกับ XML เช่น องค์ประกอบ โหนด คุณลักษณะ ฯลฯ DOM API จะโหลดเอกสาร XML ที่สมบูรณ์ลงในหน่วยความจำสำหรับการประมวลผล ดังนั้นจึงไม่เหมาะสำหรับการทำงานกับไฟล์ XML ขนาดใหญ่
  • แซ็กซ์: Simple API สำหรับ XML เป็นอัลกอริทึมที่ขับเคลื่อนด้วยเหตุการณ์สำหรับการอ่าน XML ที่นี่ XML ถูกประมวลผลโดยเริ่มเหตุการณ์ที่พบเมื่ออ่าน XML ข้อกำหนดหน่วยความจำสำหรับการใช้วิธีนี้มีน้อย แต่การทำงานกับ API นั้นซับซ้อนกว่าการทำงานกับ DOM
  • สแต็กซ์: Streaming API สำหรับ XML เป็นส่วนเสริมล่าสุดของ XML API และให้การกรอง การประมวลผล และการแก้ไข XML ที่มีประสิทธิภาพสูง แม้ว่าจะหลีกเลี่ยงการโหลดเอกสาร XML ทั้งหมดลงในหน่วยความจำ แต่ก็มีสถาปัตยกรรมประเภทดึงมากกว่าสถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ ดังนั้นแอปพลิเคชันจึงเขียนโค้ดและทำความเข้าใจได้ง่ายกว่าการใช้ SAX API

ในบทความนี้ เราใช้ DOM API เพื่อสาธิตวิธีการอ่านและเขียนไฟล์ XML จากจาวา เราจะกล่าวถึง API อีกสองรายการในบทความต่อๆ ไป

ไฟล์ XML ตัวอย่าง

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






Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.


Ralls, Kim
...

การอ่านไฟล์ XML

ให้เราดูขั้นตอนพื้นฐานที่จำเป็นสำหรับการอ่านไฟล์ XML โดยใช้ DOM API

ขั้นตอนแรกคือการได้รับอินสแตนซ์ของ DocumentBuilder . ตัวสร้างใช้เพื่อแยกวิเคราะห์เอกสาร XML สำหรับการใช้งานพื้นฐาน เราทำดังนี้:





วิธีติดตั้งฟอนต์ให้ gimp
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

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

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

แค่นั้นแหละ! DOM API สำหรับการอ่าน XML นั้นง่ายมาก ตอนนี้คุณมีสิทธิ์เข้าถึงเอกสาร XML ทั้งหมดโดยเริ่มจากองค์ประกอบรูท แคตตาล็อก . ให้เราดูวิธีการทำงานกับมัน





การใช้ DOM API

ตอนนี้เรามีรูท XML แล้ว ธาตุ เราสามารถใช้ DOM API เพื่อดึงข้อมูลที่น่าสนใจ

รับทั้งหมด หนังสือ ลูกขององค์ประกอบรูทและวนซ้ำ สังเกตว่า getChildNodes() ผลตอบแทน ทั้งหมด รวมทั้งข้อความ ความคิดเห็น ฯลฯ สำหรับจุดประสงค์ของเรา เราต้องการเพียงแค่องค์ประกอบย่อย ดังนั้นเราจึงข้ามองค์ประกอบอื่นๆ

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
// work with the book Element here
}

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

static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; i Node child = children.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
if ( child.getNodeName().equals(tagName) )
return child;
}
return null;
}

โปรดทราบว่า DOM API ถือว่าเนื้อหาข้อความภายในองค์ประกอบเป็นโหนดแยกประเภท TEXT_NODE . นอกจากนี้ เนื้อหาข้อความอาจถูกแบ่งออกเป็นโหนดข้อความที่อยู่ติดกันหลายโหนด ดังนั้นจำเป็นต้องมีการประมวลผลพิเศษต่อไปนี้เพื่อดึงเนื้อหาข้อความภายในองค์ประกอบ

static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
break;
text.append(child.getNodeValue());
}
return text.toString();
}

ด้วยฟังก์ชันอำนวยความสะดวกเหล่านี้ ให้เราดูโค้ดสำหรับแสดงรายการข้อมูลบางส่วนจาก XML ตัวอย่างของเรา เราต้องการแสดงข้อมูลโดยละเอียดของหนังสือแต่ละเล่ม เช่น จะมีอยู่ในแคตตาล็อกหนังสือ

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
ii++;
String id = book.getAttribute('id');
String author = getCharacterData(findFirstNamedElement(child,'author'));
String title = getCharacterData(findFirstNamedElement(child,'title'));
String genre = getCharacterData(findFirstNamedElement(child,'genre'));
String price = getCharacterData(findFirstNamedElement(child,'price'));
String pubdate = getCharacterData(findFirstNamedElement(child,'pubdate'));
String descr = getCharacterData(findFirstNamedElement(child,'description'));
System.out.printf('%3d. book id = %s
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}

การเขียนเอาต์พุต XML

Java ให้ XML Transform API เพื่อแปลงข้อมูล XML เราใช้ API นี้กับ การแปลงตัวตน เพื่อสร้างผลผลิต

ตัวอย่างเช่นให้เราเพิ่มใหม่ หนังสือ องค์ประกอบไปยังแคตตาล็อกตัวอย่างที่นำเสนอข้างต้น รายละเอียดของหนังสือ (เช่น ผู้เขียน , ชื่อ ฯลฯ) สามารถรับได้จากภายนอก อาจมาจากไฟล์คุณสมบัติหรือฐานข้อมูล เราใช้ไฟล์คุณสมบัติต่อไปนี้เพื่อโหลดข้อมูล

id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

ขั้นตอนแรกคือการแยกวิเคราะห์ไฟล์ XML ที่มีอยู่โดยใช้วิธีการที่แสดงด้านบน รหัสยังแสดงอยู่ด้านล่าง

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

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

String propsFile = ...;
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {
props.load(in);
}

เมื่อโหลดคุณสมบัติแล้ว เราจะดึงค่าที่เราต้องการเพิ่มจากไฟล์คุณสมบัติ

String id = props.getProperty('id');
String author = props.getProperty('author');
String title = props.getProperty('title');
String genre = props.getProperty('genre');
String price = props.getProperty('price');
String publish_date = props.getProperty('publish_date');
String descr = props.getProperty('description');

ให้เราสร้างช่องว่าง หนังสือ ธาตุ.

แถบงานแสดงในหน้าต่างเต็มหน้าจอ 10
Element book = document.createElement('book');
book.setAttribute('id', id);

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

List elnames =Arrays.asList('author', 'title', 'genre', 'price',
'publish_date', 'description');
for (String elname : elnames) {
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);

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

สำหรับการเขียน XML เราต้องการอินสแตนซ์ของ หม้อแปลงไฟฟ้า ซึ่งสร้างขึ้นตามที่แสดงด้านล่าง โปรดทราบว่าเราขอเยื้อง XML เอาต์พุตโดยใช้ setOutputProperty() กระบวนการ.

TransformerFactory tfact = TransformerFactory.newInstance();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, 'yes');
tform.setOutputProperty('{http://xml.apache.org/xslt}indent-amount', '3');

ขั้นตอนสุดท้ายในการสร้างเอาต์พุต XML คือการใช้การแปลงรูปแบบ ผลลัพธ์ปรากฏบนกระแสเอาต์พุต System.out .

tform.transform(new DOMSource(document), new StreamResult(System.out));

ในการเขียนเอาต์พุตไปยังไฟล์โดยตรง ให้ใช้สิ่งต่อไปนี้

tform.transform(new DOMSource(document), new StreamResult(new File('output.xml')));

และนั่นเป็นการสรุปบทความนี้เกี่ยวกับการอ่านและการเขียนไฟล์ XML โดยใช้ DOM API

คุณเคยใช้ DOM API ในแอปพลิเคชันของคุณหรือไม่? มันดำเนินการอย่างไร? โปรดแจ้งให้เราทราบในความคิดเห็นด้านล่าง

แบ่งปัน แบ่งปัน ทวีต อีเมล Canon กับ Nikon: กล้องยี่ห้อไหนดีกว่ากัน?

Canon และ Nikon เป็นสองชื่อที่ใหญ่ที่สุดในอุตสาหกรรมกล้อง แต่แบรนด์ใดที่มีกล้องและเลนส์รุ่นต่างๆ ที่ดีกว่ากัน?

อ่านต่อไป
หัวข้อที่เกี่ยวข้อง
  • การเขียนโปรแกรม
  • Java
เกี่ยวกับผู้เขียน เจ ศรีธา(เผยแพร่บทความ 17 บทความ) เพิ่มเติมจาก Jay Sridhar

สมัครรับจดหมายข่าวของเรา

เข้าร่วมจดหมายข่าวของเราสำหรับเคล็ดลับทางเทคนิค บทวิจารณ์ eBook ฟรี และดีลพิเศษ!

คลิกที่นี่เพื่อสมัครสมาชิก