บทความนี้ดี ~ เป็นการสร้างอินสแตนซ์การทำงานพื้นฐานของ JDOM อย่างไรก็ตาม เนื่องจากเวอร์ชัน JDOM ที่ผู้เขียนใช้ในขณะนั้นยังค่อนข้างเก่า บางโค้ดจึงคอมไพล์ไม่ถูกต้อง! การสนับสนุนภาษาจีนก็ไม่ดีเช่นกัน! ดังนั้นฟาโรห์จึงทำการปรับเปลี่ยนโปรแกรมตามผลงานของผู้เขียนต้นฉบับ! แก้ไขข้อผิดพลาดในการคอมไพล์และตัวอักษรจีนที่อ่านไม่ออก เผยแพร่ให้ทุกคนได้เรียนรู้และนำไปใช้
สภาพแวดล้อมการทดสอบ: jdom1.0, เว็บลอจิก 8.1sp2, tomcat 5.0, IE 6.0
/================================== ข้อความเริ่มต้น============= = ==========================/
จาวา + XML = JDOM!
นี่คือเป้าหมายของนักออกแบบ JDOM หากคุณเคยใช้ SAX หรือ DOM ที่น่ารำคาญในการประมวลผล XML คุณจะรู้ว่าเหตุใดจึงจำเป็นต้องใช้ JDOM หรือ JAXB ในการประชุม JavaOne ปีนี้ (พ.ศ. 2545) Jason Hunter ผู้ก่อตั้งหลักของ JDOM ได้กล่าวสุนทรพจน์ที่ยอดเยี่ยมเกี่ยวกับการแนะนำเทคโนโลยี JDOM ในหัวข้อ JDOM Makes XML Easy
รับและติดตั้ง JDOM
สามารถดาวน์โหลด JDOM เวอร์ชันล่าสุดได้ที่ http://jdom.org ยกตัวอย่างเวอร์ชันไบนารีของ JDOM 1.0 หลังจากดาวน์โหลด ให้คลายซิปไฟล์ JDOM jar คือไฟล์ jdom.jar ในไดเร็กทอรี build และเพิ่มลงในคลาสพาธ นอกจากนี้ JDOM ยังต้องการการสนับสนุนไฟล์ jar เหล่านั้นในไดเร็กทอรี lib เช่น xerces.jar และ jaxp.jar หากเกิดข้อผิดพลาดต่อไปนี้ระหว่างการใช้งาน:
java.lang.NoSuchMethodError
หรือ
java.lang.NoClassDefFoundError: org/xml/sax/SAXNotRecognizedException
คุณต้องแน่ใจว่าไฟล์ xerces.jar ตั้งอยู่ก่อนคลาส XML อื่นๆ เช่น JAXP หรือ Crimson ใน CLASSPATH ไฟล์คลาสเหล่านี้ รวมถึง xerces เวอร์ชันเก่าก่อนหน้า อาจไม่รองรับ SAX2.0 หรือ DOM ระดับ 2 ส่งผลให้เกิดข้อผิดพลาดข้างต้น
ตัวอย่างง่ายๆ
วิธีการประมวลผลของ JDOM ค่อนข้างคล้ายกับ DOM แต่ส่วนใหญ่จะใช้งานโดยใช้ SAX ดังนั้นคุณจึงไม่ต้องกังวลกับปัญหาด้านความเร็วในการประมวลผลและหน่วยความจำ นอกจากนี้ แทบไม่มีอินเทอร์เฟซใน JDOM คลาสทั้งหมดเป็นคลาสจริง และไม่มีคลาสแฟคทอรีของคลาส
ต่อไปนี้เป็นไฟล์ XML ที่ใช้สำหรับตัวอย่าง: MyXml.xml
<?xml version="1.0" encoding="utf-8"?>
<ห้องสมุด>
<หนังสือ>
<ชื่อหนังสือ>ความรู้เบื้องต้นเกี่ยวกับการเขียนโปรแกรม Java</ชื่อหนังสือ>
<Author>จางซาน</Author>
<สำนักพิมพ์>สำนักพิมพ์อิเล็กทรอนิกส์</สำนักพิมพ์>
<ราคา>35.0</ราคา>
<วันที่ตีพิมพ์>2002-10-07</วันที่ตีพิมพ์>
</หนังสือ>
<หนังสือ>
<ชื่อหนังสือ>การประยุกต์ใช้ XML ใน Java</ชื่อหนังสือ>
<Author>หลี่ ซี</Author>
<สำนักพิมพ์>สำนักพิมพ์โฮป</สำนักพิมพ์>
<ราคา>92.0</ราคา>
<วันที่ตีพิมพ์>2002-10-07</วันที่ตีพิมพ์>
</หนังสือ>
</ห้องสมุด>
ต่อไปนี้คือ Beans ที่ใช้งานไฟล์ XML: XmlBean.java
package
jdom.test;
* การดำเนินการอ่านและเขียน XML Bean
-
นำเข้า java.io.*;
นำเข้า java.util.*;
นำเข้า org.jdom.*;
นำเข้า org.jdom.output.*;
นำเข้า org.jdom.input.*;
นำเข้า javax.servlet.*;
นำเข้า javax.servlet.http.*
;
ชื่อหนังสือสตริงส่วนตัว, ผู้แต่ง, ผับ, ราคา, เผยแพร่;
สตริงสาธารณะ getbookname() {
ชื่อหนังสือคืน;
} }
สตริงสาธารณะ getauthor() {
ส่งกลับผู้เขียน;
} }
สตริงสาธารณะ getpub() {
ผับกลับ;
} }
สตริงสาธารณะ getprice() {
ราคาไปกลับ;
}
สตริงสาธารณะ getpubdate() {
ส่งคืนการเผยแพร่;
}
setbookname โมฆะสาธารณะ (ชื่อหนังสือสตริง) {
this.bookname = ชื่อหนังสือ;
}
setauthor โมฆะสาธารณะ (ผู้เขียนสตริง) {
this.author = ผู้เขียน;
}
setpub โมฆะสาธารณะ (ผับสตริง) {
this.pub = ผับ;
}
setprice โมฆะสาธารณะ (ราคาสตริง) {
this.price = ราคา;
}
setpubdate โมฆะสาธารณะ (สตริงเผยแพร่) {
this.pubdate = เผยแพร่;
}
XmlBean สาธารณะ () {
}
/**
* อ่านข้อมูลทั้งหมดจากไฟล์ XML
-
เวกเตอร์สาธารณะ LoadXML (เส้นทางสตริง) พ่นข้อยกเว้น {
เวกเตอร์ xmlVector = null;
FileInputStream fi = null;
พยายาม {
fi = FileInputStream ใหม่ (เส้นทาง);
xmlVector = เวกเตอร์ใหม่();
SAXBuilder sb = ใหม่ SAXBuilder();
เอกสาร doc = sb.build(fi);
องค์ประกอบ root = doc.getRootElement(); // รับองค์ประกอบราก
รายการหนังสือ = root.getChildren(); // รับการรวบรวมองค์ประกอบลูกทั้งหมดขององค์ประกอบรูท
หนังสือองค์ประกอบ = null;
XmlBean xml = null;
สำหรับ (int i = 0; i < books.size(); i++) {
xml = XmlBean ใหม่();
book = (Element) books.get(i); // รับองค์ประกอบหนังสือเล่มแรก
xml.setbookname(book.getChild("ชื่อหนังสือ").getText());
xml.setauthor(book.getChild("ผู้เขียน").getText());
xml.setpub(book.getChild("สำนักพิมพ์").getText());
xml.setprice(book.getChild("ราคา").getText());
xml.setpubdate(book.getChild("วันที่ตีพิมพ์").getText());
xmlVector.add(xml);
-
} จับ (ข้อยกเว้นจ) {
System.err.println(e + "ข้อผิดพลาด");
} ในที่สุด {
พยายาม {
fi.ปิด();
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
-
-
กลับ xmlVector;
}
/**
* ลบข้อมูลที่ระบุไฟล์ XML
-
โมฆะคงสาธารณะ DelXML (คำขอ HttpServletRequest) ส่งข้อยกเว้น {
FileInputStream fi = null;
FileOutputStream สำหรับ = null;
พยายาม {
request.setCharacterEncoding("GBK");
เส้นทางสตริง = request.getParameter("path");
int xmlid = Integer.parseInt(request.getParameter("id"));
fi = FileInputStream ใหม่ (เส้นทาง);
SAXBuilder sb = ใหม่ SAXBuilder();
เอกสาร doc = sb.build(fi);
องค์ประกอบ root = doc.getRootElement(); // รับองค์ประกอบราก
รายการหนังสือ = root.getChildren(); // รับการรวบรวมองค์ประกอบลูกทั้งหมดขององค์ประกอบรูท
books.remove(xmlid);//ลบองค์ประกอบลูกในตำแหน่งที่ระบุ
// เยื้องสตริง = " ";
// บูลีน newLines = จริง;
// XMLOutputter outp = new XMLOutputter (เยื้อง, newLines, "GBK");
รูปแบบ รูปแบบ = Format.getPrettyFormat();
format.setIndent(" ");
format.setEncoding("utf-8");
XMLOutputter outp = XMLOutputter ใหม่ (รูปแบบ);
fo = FileOutputStream ใหม่ (เส้นทาง);
outp.output(doc, สำหรับ);
} จับ (ข้อยกเว้นจ) {
System.err.println(e + "ข้อผิดพลาด");
} ในที่สุด {
พยายาม {
fi.ปิด();
fo.ปิด();
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
-
-
}
/**
* เพิ่มข้อมูลข้อกำหนดไฟล์ XML
-
โมฆะคงสาธารณะ AddXML (คำขอ HttpServletRequest) ส่งข้อยกเว้น {
FileInputStream fi = null;
FileOutputStream สำหรับ = null;
พยายาม {
request.setCharacterEncoding("GBK");
เส้นทางสตริง = request.getParameter("path");
fi = FileInputStream ใหม่ (เส้นทาง);
SAXBuilder sb = ใหม่ SAXBuilder();
เอกสาร doc = sb.build(fi);
องค์ประกอบ root = doc.getRootElement(); // รับองค์ประกอบราก
รายการหนังสือ = root.getChildren(); // รับการรวบรวมองค์ประกอบลูกทั้งหมดขององค์ประกอบรูท
ชื่อหนังสือสตริง = request.getParameter("ชื่อหนังสือ");
ผู้เขียนสตริง = request.getParameter("author");
ราคาสตริง = request.getParameter("ราคา");
สตริงผับ = request.getParameter("ผับ");
สตริง pubdate = request.getParameter("pubdate");
// ส่งข้อความข้อความใหม่;
องค์ประกอบ newbook = องค์ประกอบใหม่ ("หนังสือ");
องค์ประกอบ newname = องค์ประกอบใหม่ ("ชื่อหนังสือ");
newname.setText(ชื่อหนังสือ);
newbook.addContent(ชื่อใหม่);
องค์ประกอบ newauthor = องค์ประกอบใหม่ ("ผู้เขียน");
newauthor.setText(ผู้เขียน);
newbook.addContent(ผู้เขียนใหม่);
องค์ประกอบ newpub = องค์ประกอบใหม่ ("สำนักพิมพ์");
newpub.setText(ผับ);
newbook.addContent(newpub);
องค์ประกอบ newprice = องค์ประกอบใหม่ ("ราคา");
newprice.setText(ราคา);
newbook.addContent(ราคาใหม่);
องค์ประกอบ newdate = องค์ประกอบใหม่ ("วันที่เผยแพร่");
newdate.setText (เผยแพร่);
newbook.addContent (วันใหม่);
books.add(newbook);//เพิ่มองค์ประกอบย่อย
// เยื้องสตริง = " ";
// บูลีน newLines = จริง;
// XMLOutputter outp = new XMLOutputter (เยื้อง, newLines, "GBK");
รูปแบบ รูปแบบ = Format.getPrettyFormat();
format.setIndent(" ");
format.setEncoding("utf-8");
XMLOutputter outp = XMLOutputter ใหม่ (รูปแบบ);
fo = FileOutputStream ใหม่ (เส้นทาง);
outp.output(doc, สำหรับ);
} จับ (ข้อยกเว้นจ) {
System.err.println(e + "ข้อผิดพลาด");
} ในที่สุด {
พยายาม {
fi.ปิด();
fo.ปิด();
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
-
-
}
/**
* แก้ไขข้อมูลที่ระบุไฟล์ XML
-
โมฆะคงสาธารณะ EditXML (คำขอ HttpServletRequest) ส่งข้อยกเว้น {
FileInputStream fi = null;
FileOutputStream สำหรับ = null;
พยายาม {
request.setCharacterEncoding("GBK");
เส้นทางสตริง = request.getParameter("path");
int xmlid = Integer.parseInt(request.getParameter("id"));
fi = FileInputStream ใหม่ (เส้นทาง);
SAXBuilder sb = SAXBuilder ใหม่ ();
เอกสาร doc = sb.build(fi);
องค์ประกอบ root = doc.getRootElement(); // รับองค์ประกอบราก
รายการหนังสือ = root.getChildren(); // รับการรวบรวมองค์ประกอบลูกทั้งหมดขององค์ประกอบรูท
หนังสือองค์ประกอบ = (องค์ประกอบ) books.get(xmlid);
ชื่อหนังสือสตริง = request.getParameter("ชื่อหนังสือ");
ผู้เขียนสตริง = request.getParameter("author");
ราคาสตริง = request.getParameter("price");
สตริงผับ = request.getParameter("ผับ");
สตริง pubdate = request.getParameter("pubdate");
// ส่งข้อความข้อความใหม่;
องค์ประกอบ newname = book.getChild("ชื่อหนังสือ");
newname.setText(bookname);//แก้ไขชื่อหนังสือเป็นชื่อใหม่
องค์ประกอบ newauthor = book.getChild("ผู้เขียน");
newauthor.setText(ผู้เขียน);
องค์ประกอบ newpub = book.getChild("สำนักพิมพ์");
newpub.setText(ผับ);
องค์ประกอบ newprice = book.getChild("price");
newprice.setText(ราคา);
องค์ประกอบ newdate = book.getChild("วันที่ตีพิมพ์");
newdate.setText (เผยแพร่);
//books.set(xmlid,book);//แก้ไของค์ประกอบย่อย
// เยื้องสตริง = " ";
// บูลีน newLines = จริง;
// XMLOutputter outp = new XMLOutputter (เยื้อง, newLines, "GBK");
รูปแบบ รูปแบบ = Format.getPrettyFormat();
format.setIndent(" ");
format.setEncoding("utf-8");
XMLOutputter outp = XMLOutputter ใหม่ (รูปแบบ);
fo = FileOutputStream ใหม่ (เส้นทาง);
outp.output(doc, สำหรับ);
} จับ (ข้อยกเว้นจ) {
System.err.println(e + "ข้อผิดพลาด");
} ในที่สุด {
พยายาม {
fi.ปิด();
fo.ปิด();
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
-
-
-
}
ต่อไปนี้เป็นไฟล์ jsp สำหรับการดำเนินการ: test.jsp
<%@ หน้า contentType="text/html;charset=GBK"%>
<%@ ภาษาเพจ = "java" import="java.util.*,jdom.test.*"%>
<html>
<หัว>
<title>อ่านข้อมูลไฟล์ XML</title>
</หัว>
<ร่างกาย>
<h3 align="center">ไฟล์ XML การดำเนินการ JDOM</h3>
<p align="center">อ่านข้อมูลทั้งหมดในไฟล์ XML</p>
<ศูนย์>
<เส้นขอบตาราง = "1" cellpadding = "0" cellspacing = "1"
style="border-collapse:ยุบ" width="80%" id="AutoNumber1">
<tr>
<td align="center" width="92">ชื่อหนังสือ</td>
<td align="center" width="92">ผู้เขียน</td>
<td align="center" width="92">ผู้จัดพิมพ์</td>
<td align="center" width="92">ราคา</td>
<td align="center" width="92">วันที่เผยแพร่</td>
<td align="center" width="94">การทำงาน</td>
</tr>
</ตาราง>
-
เส้นทางสตริง = application.getRealPath("/JDOM/MyXml.xml");
XmlBean xml = XmlBean ใหม่();
เวกเตอร์ xmlall = xml.LoadXML(เส้นทาง);
สำหรับ (int i = 0; i < xmlall.size(); i++) {
xml = (XmlBean) xmlall.elementAt(i);
/**out.println("ชื่อหนังสือ:"+xml.getbookname()+"<br>");
out.println("ผู้เขียน:"+xml.getauthor()+"<br>");
out.println("สำนักพิมพ์:"+xml.getpub()+"<br>");
out.println("ราคา:"+xml.getprice()+"<br>");
out.println("วันที่ตีพิมพ์:"+xml.getpubdate()+"<br><br>");
-
-
<เส้นขอบตาราง = "1" cellpadding = "0" cellspacing = "1"
style="border-collapse:ยุบ" width="80%" id="AutoNumber2">
<tr>
<td align="center" width="92"><%=xml.getbookname()%></td>
<td align="center" width="92"><%=xml.getauthor()%></td>
<td align="center" width="92"><%=xml.getpub()%></td>
<td align="center" width="92"><%=xml.getprice()%></td>
<td align="center" width="92"><%=xml.getpubdate()%></td>
<td align="center" width="94"><a
href="xmlaction.jsp?act=del&id=<%=i%>&path=<%=path%>">ลบ</a></td>
</tr>
</ตาราง>
<%}%></center>
<รูปแบบวิธีการ = "POST" action = "xmlaction.jsp">
<p align="center"><input type="radio" value="add" check name="act">เพิ่มข้อมูล
<input type="radio" value="edit" name="act">แก้ไขหมายเลขซีเรียลของข้อมูล:<select size="1"
ชื่อ = "รหัส">
<%สำหรับ (int i = 0; i < xmlall.size(); i++) {%>
<option value="<%=i%>">บทความ <%=i + 1%></option>
-
</เลือก><br>
ชื่อหนังสือ:<input type="text" name="bookname" size="20"><br>
ผู้แต่ง:<input type="text" name="author" size="20"><br>
ผู้จัดพิมพ์:<input type="text" name="pub" size="20"><br>
ราคา:<input type="text" name="price" size="20"><br>
วันที่:<input type="text" name="pubdate" size="20"></p>
<input type="hidden" name="path" value="<%=path%>">
<p align="center"><input type="submit" value="Submit" name="B1"><input
type="รีเซ็ต" value="รีเซ็ต" name="B2"></p>
</แบบฟอร์ม>
</ร่างกาย>
</html>
ต่อไปนี้เป็นไฟล์ jsp ที่จัดการการส่งไฟล์ก่อนหน้า: xmlation.jsp
<%@ หน้า contentType="text/html;charset=GBK"%>
<%@ ภาษาหน้า = "java" import = "jdom.test.*"%>
<%if (request.getParameter("act") != null
&& request.getParameter("การกระทำ").เท่ากับ("เพิ่ม")) {
XmlBean.AddXML(ร้องขอ);
out.println("<p align='center'><br><br>เพิ่มเรียบร้อยแล้ว<br><br><a href='test.jsp'>ส่งคืน</a>");
} อื่น ๆ ถ้า (request.getParameter("act") != null
&& request.getParameter("การกระทำ").เท่ากับ("del")) {
XmlBean.DelXML(ร้องขอ);
out.println("<p align='center'><br><br>ลบสำเร็จ<br><br><a href='test.jsp'>ส่งคืน</a>");
} อื่น ๆ ถ้า (request.getParameter("act") != null
&& request.getParameter("การกระทำ").เท่ากับ("แก้ไข")) {
XmlBean.EditXML(ร้องขอ);
out.println("<p align='center'><br><br>การแก้ไขสำเร็จ<br><br><a href='test.jsp'>ส่งคืน</a>");
} อื่น {
out.print("<p align='center'><br><br>การดำเนินการที่ผิดกฎหมาย<br><br><a href='test.jsp'>ส่งคืน</a>");
-
-
/================================ จบข้อความ============== == ========================/
หมายเหตุ:
1. ส่วนสีเหลืองของข้อความชื่อของฟาโรห์ในไฟล์ XmlBean.java คือการดัดแปลง และส่วนสีม่วงเป็นวิธีการเขียนของโปรแกรมต้นฉบับ!
2. การเข้ารหัสเริ่มต้นของไฟล์ MyXml.xml ถูกเปลี่ยนเป็น encoding="utf-8" เนื่องจากจะผิดปกติเสมอเมื่อแยกวิเคราะห์ GBK หรือ GB2312 ภายใต้ weblogic 8 Tomcat ใช้ได้ และอาจเป็น xml เริ่มต้นของ weblogic parser ไม่รองรับ GBK ปัญหานี้ยังไม่ได้รับการแก้ไข หากผู้เชี่ยวชาญคนใดรู้วิธีแก้ปัญหา โปรดตอบกลับโพสต์นี้และบอกฉัน ~~ ขอบคุณทุกคน!