Эта статья хороша ~ она описывает основные операции JDOM. Однако, поскольку версия JDOM, используемая автором в то время, была еще относительно старой, некоторые коды компилировались некорректно! Поддерживать китайцев тоже нехорошо! Поэтому Фараон внес в программу модификации на основе оригинальной авторской работы! Исправлены ошибки компиляции и искаженные китайские иероглифы. Опубликуйте его, чтобы каждый мог его изучить и использовать.
Тестовая среда: jdom1.0, weblogic 8.1sp2, tomcat 5.0, IE 6.0.
/=================================Начало текста============ = =========================/
Java + XML = JDOM!
Это цель дизайнеров JDOM. Если вы когда-либо использовали раздражающие SAX или DOM для обработки XML, вы знаете, зачем нужен JDOM или JAXB. На конференции JavaOne в этом году (2002 г.) Джейсон Хантер, главный основатель JDOM, выступил с замечательной речью, представившей технологию JDOM, под названием «JDOM делает XML простым».
Получите и установите JDOM
Последнюю версию JDOM можно загрузить по адресу http://jdom.org . В качестве примера возьмем двоичную версию JDOM 1.0. После загрузки разархивируйте его. JDOM-файл jar — это файл jdom.jar в каталоге сборки и добавьте его в путь к классам. Кроме того, JDOM также необходима поддержка таких файлов jar в каталоге lib, как xerces.jar и jaxp.jar. Если во время использования возникает следующая ошибка:
java.lang.NoSuchMethodError
или
java.lang.NoClassDefFoundError: org/xml/sax/SAXNotRecouncedException
Вам необходимо убедиться, что файл xerces.jar расположен перед другими классами XML, такими как JAXP или Crimson, в CLASSPATH. Эти файлы классов, включая предыдущие старые версии xerces, могут не поддерживать SAX2.0 или DOM Level 2. Это привело к вышеуказанной ошибке.
простой пример
Метод обработки JDOM чем-то похож на DOM, но в основном он реализован с использованием SAX, поэтому вам не придется беспокоиться о скорости обработки и проблемах с памятью. Кроме того, в JDOM почти нет интерфейсов, все классы — настоящие классы, а классы-фабрики классов отсутствуют.
Ниже приведен XML-файл, использованный в примере: MyXml.xml
<?xml version="1.0"coding="utf-8"?>
<Библиотека>
<книга>
<Название книги>Введение в программирование на Java</Название книги>
<Автор>Чжан Сан</Автор>
<Издательство>Электронное издательство</Издательство>
<Цена>35,0</Цена>
<Дата публикации>07.10.2002</Дата публикации>
</книга>
<книга>
<Название книги>Применение XML в Java</Название книги>
<Автор>Ли Си</Автор>
<Издательство>Издательство «Надежда»</Издательство>
<Цена>92,0</Цена>
<Дата публикации>07.10.2002</Дата публикации>
</книга>
</библиотека>
Ниже приведены компоненты, которые работают с 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.*;
общественный класс XmlBean {
частная строка имя книги, автор, паб, цена, дата публикации
public String getbookname() {;
вернуть имя книги;
}
публичная строка getauthor() {
вернуть автора;
}
Публичная строка getpub() {
возвратный паб;
}
Публичная строка getprice() {
цена возврата;
}
общественная строка getpubdate() {
вернуть дату публикации;
}
public void setbookname(String bookname) {
this.bookname = имя книги;
}
public void setauthor(Stringauthor) {
this.author = автор;
}
public void setpub (String pub) {
this.pub = паб;
}
public void setprice (строковая цена) {
this.price = цена;
}
public void setpubdate(String pubdate) {
this.pubdate = дата публикации;
}
Общественный XmlBean() {
}
/**
* Прочитайте всю информацию из файла XML
*/
public Vector LoadXML (путь к строке) выдает исключение {
Вектор xmlVector = ноль;
FileInputStream фи = ноль;
пытаться {
фи = новый FileInputStream (путь);
xmlVector = новый вектор();
SAXBuilder sb = новый SAXBuilder();
Документ документа = sb.build(fi);
Корень элемента = doc.getRootElement(); // Получаем корневой элемент
Список книг = root.getChildren(); // Получаем коллекцию всех дочерних элементов корневого элемента.
Книга элементов = ноль;
XmlBean xml = ноль;
for (int i = 0; i <books.size(); i++) {
xml = новый XmlBean();
book = (Element) book.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);
}
} catch (Исключение е) {
System.err.println(e + «ошибка»);
} окончательно {
пытаться {
фи.закрыть();
} catch (Исключение е) {
е.printStackTrace();
}
}
вернуть xmlVector;
}
/**
* Удалить информацию, указанную в XML-файле.
*/
public static void DelXML (запрос HttpServletRequest) выдает исключение {
FileInputStream фи = ноль;
FileOutputStream fo = null;
пытаться {
request.setCharacterEncoding("GBK");
Строковый путь = request.getParameter("путь");
int xmlid = Integer.parseInt(request.getParameter("id"));
фи = новый FileInputStream (путь);
SAXBuilder sb = новый SAXBuilder();
Документ документа = sb.build(fi);
Корень элемента = doc.getRootElement(); // Получаем корневой элемент
Список книг = root.getChildren(); // Получаем коллекцию всех дочерних элементов корневого элемента.
book.remove(xmlid);//Удалить дочерний элемент в указанной позиции
// Отступ строки = " ";
// логическое значение newLines = true;
// XMLOutputter outp = новый XMLOutputter(indent, newLines, "GBK");
Формат формата = Format.getPrettyFormat();
format.setIndent(" ");
format.setEncoding("utf-8");
XMLOutputter outp = новый XMLOutputter (формат);
fo = новый FileOutputStream (путь);
outp.output(док, ФО);
} catch (Исключение е) {
System.err.println(e + «ошибка»);
} окончательно {
пытаться {
фи.закрыть();
фо.закрыть();
} catch (Исключение е) {
е.printStackTrace();
}
}
}
/**
* Добавить информацию о спецификации XML-файла.
*/
public static void AddXML (запрос HttpServletRequest) выдает исключение {
FileInputStream фи = ноль;
FileOutputStream fo = null;
пытаться {
request.setCharacterEncoding("GBK");
Строковый путь = request.getParameter("путь");
фи = новый FileInputStream (путь);
SAXBuilder sb = новый SAXBuilder();
Документ документа = sb.build(fi);
Корень элемента = doc.getRootElement(); // Получаем корневой элемент
Список книг = root.getChildren(); // Получаем коллекцию всех дочерних элементов корневого элемента.
Строка bookname = request.getParameter("bookname");
Строка автор = request.getParameter("автор");
Строковая цена = request.getParameter("цена");
Строка pub = request.getParameter("pub");
Строка pubdate = request.getParameter("pubdate");
// Текст новыйтекст;
Элемент newbook = новый элемент("книга");
Элемент newname = новый элемент("Название книги");
новоеимя.setText(имя книги);
новая книга.addContent(новое имя);
Элемент newauthor = новый элемент("автор");
новыйавтор.setText(автор);
новая книга.addContent(новый автор);
Элемент newpub = новый Элемент("Издательство");
новыйpub.setText(паб);
newbook.addContent(newpub);
Элемент newprice = новый элемент("цена");
новаяцена.setText(цена);
newbook.addContent(новая цена);
Элемент newdate = новый элемент("Дата публикации");
newdate.setText(pubdate);
newbook.addContent(новая дата);
book.add(newbook);//Добавляем дочерние элементы
// Отступ строки = " ";
// логическое значение newLines = true;
// XMLOutputter outp = новый XMLOutputter(indent, newLines, "GBK");
Формат формата = Format.getPrettyFormat();
format.setIndent(" ");
format.setEncoding("utf-8");
XMLOutputter outp = новый XMLOutputter (формат);
fo = новый FileOutputStream (путь);
outp.output(док, фо);
} catch (Исключение е) {
System.err.println(e + «ошибка»);
} окончательно {
пытаться {
фи.закрыть();
фо.закрыть();
} catch (Исключение е) {
е.printStackTrace();
}
}
}
/**
* Изменить информацию, указанную в XML-файле.
*/
public static void EditXML (запрос HttpServletRequest) выдает исключение {
FileInputStream фи = ноль;
FileOutputStream fo = null;
пытаться {
request.setCharacterEncoding("GBK");
Строковый путь = request.getParameter("путь");
int xmlid = Integer.parseInt(request.getParameter("id"));
фи = новый FileInputStream (путь);
SAXBuilder sb = новый SAXBuilder();
Документ документа = sb.build(fi);
Корень элемента = doc.getRootElement(); // Получаем корневой элемент
Список книг = root.getChildren(); // Получаем коллекцию всех дочерних элементов корневого элемента.
Элемент book = (Элемент) book.get(xmlid);
Строка bookname = request.getParameter("bookname");
Строка автор = request.getParameter("автор");
Строковая цена = request.getParameter("цена");
Строка pub = request.getParameter("pub");
Строка pubdate = request.getParameter("pubdate");
// Текст новыйтекст;
Элемент newname = book.getChild("Название книги");
newname.setText(bookname);//Измените название книги на новое название
Элемент newauthor = book.getChild("Автор");
новыйавтор.setText(автор);
Элемент newpub = book.getChild("Издательство");
новыйpub.setText(паб);
Элемент newprice = book.getChild("цена");
новаяцена.setText(цена);
Элемент newdate = book.getChild("Дата публикации");
newdate.setText(pubdate);
//books.set(xmlid,book);//Изменить подэлементы
// Отступ строки = " ";
// логическое значение newLines = true;
// XMLOutputter outp = новый XMLOutputter(indent, newLines, "GBK");
Формат формата = Format.getPrettyFormat();
format.setIndent(" ");
format.setEncoding("utf-8");
XMLOutputter outp = новый XMLOutputter (формат);
fo = новый FileOutputStream (путь);
outp.output(док, фо);
} catch (Исключение е) {
System.err.println(e + «ошибка»);
} окончательно {
пытаться {
фи.закрыть();
фо.закрыть();
} catch (Исключение е) {
е.printStackTrace();
}
}
}
}
Ниже приведен файл jsp для работы: test.jsp.
<%@ page contentType="text/html;charset=GBK"%>
<%@ page Language="java" import="java.util.*,jdom.test.*"%>
<html>
<голова>
<title>Чтение данных XML-файла</title>
</голова>
<тело>
<h3 align="center">XML-файл операции JDOM</h3>
<p align="center">Читать все данные в XML-файле</p>
<центр>
<table border="1" cellpadding="0" cellpacing="1"
style="border-collapse: свернуть" width="80%" id="AutoNumber1">
<тр>
<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: свернуть" width="80%" id="AutoNumber2">
<тр>
<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>
</таблица>
<%}%></центр>
<form метод="POST" action="xmlaction.jsp">
<p align="center"><input type="radio" value="add" проверенное имя="act">Добавить информацию
<input type="radio" value="edit" name="act">Изменить серийный номер данных:<select size="1"
имя="идентификатор">
<%for (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="reset" value="Reset" name="B2"></p>
</форма>
</тело>
</html>
Ниже приведен файл jsp, который обрабатывает отправку предыдущего файла: xmlation.jsp.
<%@ page contentType="text/html;charset=GBK"%>
<%@ page Language="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 была изменена на кодировку="utf-8", поскольку она всегда является ненормальной при анализе GBK или GB2312 в weblogic 8. Tomcat в порядке, и это может быть собственный XML-файл по умолчанию для weblogic. парсер не поддерживает GBK. Эта проблема не решена. Если кто-то из экспертов знает решение, ответьте на это сообщение и сообщите мне ~~ Всем спасибо!