この記事は JDOM の基本的な操作をインスタンス化するのに適しています。ただし、著者が当時使用していた JDOM のバージョンがまだ比較的古いため、一部のコードは正しくコンパイルされません。中国語対応もダメ!そこで、ファラオは原作者の作品に基づいてプログラムを修正しました。コンパイルエラーと中国語の文字化けを修正しました。誰もが学び、使用できるように公開します。
テスト環境: jdom1.0、weblogic 8.1sp2、tomcat 5.0、IE 6.0
/==================================本文の始まり============= = ==========================/
Java + XML = JDOM!
これが JDOM 設計者の目標です。 XML を処理するために煩わしい SAX または DOM を使用したことがある場合は、JDOM または JAXB が必要な理由がわかるでしょう。今年 (2002 年) の JavaOne カンファレンスで、JDOM の主な創設者であるジェイソン・ハンターは、「JDOM は XML を簡単にする」と題して、JDOM テクノロジーを紹介する素晴らしいスピーチを行いました。
JDOM を入手してインストールする
JDOM の最新バージョンはhttp://jdom.orgからダウンロードできます。 JDOM 1.0 のバイナリ バージョンを例に挙げます。ダウンロード後、JDOM jar ファイルを解凍し、ビルド ディレクトリにあるファイル jdom.jar をクラスパスに追加します。さらに、JDOM では、lib ディレクトリ内の xerces.jar や jaxp.jar などの jar ファイルのサポートも必要です。使用中に以下のエラーが発生した場合:
java.lang.NoSuchMethodError
または
java.lang.NoClassDefFoundError: org/xml/sax/SAXNotRecognizedException
xerces.jar ファイルが CLASSPATH 内で JAXP や Crimson などの他の XML クラスより前に配置されていることを確認する必要があります。これらのクラス ファイル (以前の古いバージョンの xerces を含む) は、SAX2.0 または DOM レベル 2 をサポートしていない可能性があります。その結果、上記のエラーが発生しました。
簡単な例
JDOM の処理方法は DOM に似ていますが、主に SAX を使用して実装されているため、処理速度やメモリの問題を心配する必要はありません。さらに、JDOM にはインターフェイスがほとんどなく、すべてのクラスが実クラスであり、クラス ファクトリ クラスもありません。
この例で使用される XML ファイルは次のとおりです: MyXml.xml
<?xml version="1.0"coding="utf-8"?>
<図書館>
<本>
<書籍のタイトル>Java プログラミング入門</書籍のタイトル>
<著者>張三</著者>
<出版社>電子出版社</出版社>
<価格>35.0</価格>
<発行日>2002-10-07</発行日>
</本>
<本>
<書籍タイトル>Java における XML のアプリケーション</書籍タイトル>
<著者>李思</著者>
<出版社>ホープ出版社</出版社>
<価格>92.0</価格>
<発行日>2002-10-07</発行日>
</本>
</ライブラリ>
XML ファイルを操作する Bean は次のとおり
です
。
* XML 読み取りおよび書き込み操作 Bean
*/
java.io.* をインポートします。
java.util.* をインポートします。
org.jdom.* をインポートします。
org.jdom.output.* をインポートします。
org.jdom.input.* をインポートします。
javax.servlet.* をインポートします。
インポート javax.servlet.http.*;
パブリック クラス XmlBean {
private String 本名、著者、出版社、価格、出版日
public String getbookname() {
本名を返します。
String
getauthor() {
著者を返す。
文字
列getpub() {
パブに戻ります。
パブリック String getprice()
{
返品価格。
public String getpubdate()
{
発行日を返します。
}
public void setbookname(String bookname) {
this.bookname = 本名;
public void setauthor(String author)
{
this.author = 著者;
public void setpub(String pub)
{
this.pub = パブ;
}
public void setprice(String 価格) {
this.price = 価格;
public void setpubdate(String pubdate)
{
this.pubdate = パブデート;
XmlBean
() {
}
/**
* XML ファイルからすべての情報を読み取ります
*/
public Vector LoadXML(String path) が例外をスローする {
ベクトル xmlVector = null;
FileInputStream fi = null;
試す {
fi = 新しい FileInputStream(パス);
xmlVector = 新しい Vector();
SAXBuilder sb = 新しい SAXBuilder();
ドキュメント doc = sb.build(fi);
Element root = doc.getRootElement(); // ルート要素を取得します。
List Books = root.getChildren() // ルート要素のすべての子要素のコレクションを取得します。
要素 book = null;
XmlBean xml = null;
for (int i = 0; i <books.size(); i++) {
xml = 新しい XmlBean();
book = (Element) Books.get(i) // 最初の book 要素を取得します。
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);
}
} catch (例外 e) {
System.err.println(e + "エラー");
} ついに {
試す {
fi.close();
} catch (例外 e) {
e.printStackTrace();
}
}
xmlVector を返します。
}
/**
※XMLファイルの指定情報を削除
*/
public static void DelXML(HttpServletRequest request) が例外をスローする {
FileInputStream fi = null;
FileOutputStream fo = null;
試す {
request.setCharacterEncoding("GBK");
文字列パス = request.getParameter("パス");
int xmlid = Integer.parseInt(request.getParameter("id"));
fi = 新しい FileInputStream(パス);
SAXBuilder sb = 新しい SAXBuilder();
ドキュメント doc = sb.build(fi);
Element root = doc.getRootElement(); // ルート要素を取得します。
List Books = root.getChildren() // ルート要素のすべての子要素のコレクションを取得します。
Books.remove(xmlid);//指定された位置の子要素を削除
// 文字列インデント = " ";
// ブール値 newLines = true;
// XMLOutputter outp = new XMLOutputter(indent, newLines, "GBK");
フォーマット format = Format.getPrettyFormat();
format.setIndent(" ");
format.setEncoding("utf-8");
XMLOutputter 出力 = 新しい XMLOutputter(format);
fo = 新しい FileOutputStream(パス);
outp.output(doc, fo);
} catch (例外 e) {
System.err.println(e + "エラー");
} ついに {
試す {
fi.close();
fo.close();
} catch (例外 e) {
e.printStackTrace();
}
}
}
/**
※XMLファイル仕様情報を追加
*/
public static void AddXML(HttpServletRequest request) が例外をスローする {
FileInputStream fi = null;
FileOutputStream fo = null;
試す {
request.setCharacterEncoding("GBK");
文字列パス = request.getParameter("パス");
fi = 新しい FileInputStream(パス);
SAXBuilder sb = 新しい SAXBuilder();
ドキュメント doc = sb.build(fi);
Element root = doc.getRootElement(); // ルート要素を取得します。
List Books = root.getChildren() // ルート要素のすべての子要素のコレクションを取得します。
文字列 本名 = request.getParameter("本名");
文字列著者 = request.getParameter("著者");
文字列価格 = request.getParameter("価格");
文字列 pub = request.getParameter("pub");
文字列 pubdate = request.getParameter("pubdate");
// テキスト newtext;
要素 newbook = new Element("book");
要素 newname = new Element("本のタイトル");
newname.setText(書籍名);
newbook.addContent(新しい名前);
要素 newauthor = new Element("author");
newauthor.setText(著者);
newbook.addContent(newauthor);
要素 newpub = new Element("出版社");
newpub.setText(pub);
newbook.addContent(newpub);
要素 newprice = new Element("価格");
newprice.setText(価格);
newbook.addContent(newprice);
要素 newdate = new Element("出版日");
newdate.setText(pubdate);
newbook.addContent(newdate);
Books.add(newbook);//子要素を追加
// 文字列インデント = " ";
// ブール値 newLines = true;
// XMLOutputter outp = new XMLOutputter(indent, newLines, "GBK");
フォーマット format = Format.getPrettyFormat();
format.setIndent(" ");
format.setEncoding("utf-8");
XMLOutputter 出力 = 新しい XMLOutputter(format);
fo = 新しい FileOutputStream(パス);
outp.output(doc, fo);
} catch (例外 e) {
System.err.println(e + "エラー");
} ついに {
試す {
fi.close();
fo.close();
} catch (例外 e) {
e.printStackTrace();
}
}
}
/**
* XMLファイルの指定情報を変更
*/
public static void EditXML(HttpServletRequest request) が例外をスローする {
FileInputStream fi = null;
FileOutputStream fo = null;
試す {
request.setCharacterEncoding("GBK");
文字列パス = request.getParameter("パス");
int xmlid = Integer.parseInt(request.getParameter("id"));
fi = 新しい FileInputStream(パス);
SAXBuilder sb = 新しい SAXBuilder();
ドキュメント doc = sb.build(fi);
Element root = doc.getRootElement(); // ルート要素を取得します。
List Books = root.getChildren() // ルート要素のすべての子要素のコレクションを取得します。
要素 book = (要素) Books.get(xmlid);
文字列 本名 = request.getParameter("本名");
文字列著者 = request.getParameter("著者");
文字列価格 = request.getParameter("価格");
文字列 pub = request.getParameter("pub");
文字列 pubdate = request.getParameter("pubdate");
// テキスト newtext;
要素 newname = book.getChild("本のタイトル");
newname.setText(bookname);//書籍名を新しいタイトルに変更します
要素 newauthor = book.getChild("著者");
newauthor.setText(著者);
要素 newpub = book.getChild("出版社");
newpub.setText(pub);
要素 newprice = book.getChild("価格");
newprice.setText(価格);
要素 newdate = book.getChild("出版日");
newdate.setText(pubdate);
//books.set(xmlid,book);//サブ要素を変更する
// 文字列インデント = " ";
// ブール値 newLines = true;
// XMLOutputter outp = new XMLOutputter(indent, newLines, "GBK");
フォーマット format = Format.getPrettyFormat();
format.setIndent(" ");
format.setEncoding("utf-8");
XMLOutputter 出力 = 新しい XMLOutputter(format);
fo = 新しい FileOutputStream(パス);
outp.output(doc, fo);
} catch (例外 e) {
System.err.println(e + "エラー");
} ついに {
試す {
fi.close();
fo.close();
} catch (例外 e) {
e.printStackTrace();
}
}
}
以下
は操作用の jsp ファイルです: test.jsp
<%@ page contentType="text/html;charset=GBK"%>
<%@ ページ言語="java" import="java.util.*,jdom.test.*"%>
<html>
<頭>
<title>XML ファイル データの読み取り</title>
</head>
<本文>
<h3 align="center">JDOM 操作 XML ファイル</h3>
<p align="center">XML ファイル内のすべてのデータを読み取る</p>
<中央>
<table border="1" cellpadding="0" cellpacing="1"
style="border-collapse: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(パス);
for (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>");
*/
%>
<table border="1" cellpadding="0" cellpacing="1"
style="border-collapse: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>
<form method="POST" action="xmlaction.jsp">
<p align="center"><input type="radio" value="add" selected name="act">情報を追加
<input type="radio" value="edit" name="act">編集データシリアル番号:<select size="1"
名前="id">
<%for (int i = 0; i < xmlall.size(); i++) {%>
<option value="<%=i%>">記事 <%=i + 1%></option>
<%}%>
</選択><br>
書籍のタイトル:<input type="text" name="書籍名" 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="reset" value="リセット" name="B2"></p>
</form>
</body>
</html>
以下は、前のファイルの送信を処理する jsp ファイルです: xmlation.jsp
<%@ page contentType="text/html;charset=GBK"%>
<%@ ページ言語="java" import="jdom.test.*"%>
<%if (request.getParameter("act") != null
&& request.getParameter("act").equals("add")) {
XmlBean.AddXML(リクエスト);
out.println("<p align='center'><br><br>正常に追加されました<br><br><a href='test.jsp'>戻る</a>");
else if (request.getParameter("act") != null
&& request.getParameter("act").equals("del")) {
XmlBean.DelXML(リクエスト);
out.println("<p align='center'><br><br>正常に削除されました<br><br><a href='test.jsp'>戻る</a>");
else if (request.getParameter("act") != null
&& request.getParameter("act").equals("edit")) {
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'>Return</a>");
}
%>
/================================本文終了============== == =======================//
述べる:
1. XmlBean.java ファイルのファラオ名のテキストの黄色の部分が修正部分、紫色の部分が元のプログラムの書き方です!
2. MyXml.xml ファイルのデフォルトのエンコーディングは、weblogic 8 で GBK または GB2312 を解析するときに常に異常となるため、encoding="utf-8" に変更されました。Tomcat は問題なく、weblogic 独自のデフォルトの XML である可能性があります。パーサーはGBKをサポートしていません。この問題は解決されていません。解決策を知っている専門家がいたら、この投稿に返信して教えてください~~皆さんありがとうございます!