JAXP、saxとdom 4 j解析xmlドキュメントとXXXPSのドキュメントのコンテンツポジショニングにおけるアプリケーション(継続的に更新し、初心者の野路子、参考と想像はもちろん、絶えず学習と専門化)
22736 ワード
JAXPケース
一つの基本的な学生の成績管理システムは、xmlドキュメントのデータベースを使って、データベースにリアルタイムで添削して学生の成績データを調べることができるように要求しています.
二、需要分析:
1.階層的な定義と実装が必要であり、ユーザー層でユーザーから照会情報を入力し、データの受信を行い、異常な抛り出し、処理とプログラムテストを行い、UI層で未獲得と処理の異常が発生しないことを保証し、不正な入力と操作情報が存在しない場合を正確に処理し、ユーザーに良いユーザ体験を与える.
2.学生パッケージID、name、scoresなどのデータを定義し、学生ツール類を定義し、検索キーワードに基づいて各種学生情報処理を行い、適切に容器を利用して複数の学生オブジェクトを格納し、階層的に抽出して簡略化し、ユーザー層で単純に受信し、呼び出しするだけとする.
三、ドキュメント、各レイヤーのインターフェースと使用する技術
(開発時は逐次更新)
四、具体的な流れの実現
1.xml文書と簡単な学生類:
学生の工具類から剥離・抽出する主な機能:各種の処理ニーズの中でJAXPのXPのXLに対する統一操作はツール類にカプセル化して抽出し、特殊な情報を目的に戻すためのカスタム異常類(後に気づく)
操作xmlドキュメントのツールを抽出します.
設定ブレークポイントDebugモードと結合して、直接テストを実行します.削除機能は、削除項目が存在しない場合、Student NotExists Exceptionを抛り出します.正常な実行可能状況です.
add:
ご要望を入力してください.aを追加します. bクエリー c削除aは受験番号を入力してください.3400534はID番号を入力してください.64392は名前を入力してください.xiabbiは住所を入力してください.beijingはスコアを入力してください.100は成功しました.ご要望を入力してください.aは追加してください. bクエリー c削除
find:
ご要望を入力してください.aを追加します. bクエリー c削除bは受験番号を入力してください.dsfsdは関連情報が見つからないので、ご要望を入力してください.a追加 bクエリー c削除bは受験番号を入力してください.222受験番号:222 id番号:111名前:張三住所:瀋陽成績:89.0はご要望を入力してください.a追加 bクエリー c削除
delete:
ご要望を入力してください.aを追加します. bクエリー c削除c学生の名前を入力してください.sdfsdf sdfこの学生はいません.ご希望を入力してください. bクエリー c削除c学生の名前を入力してください.李四削除に成功しました.ご要望を入力してください.a追加 bクエリー c削除
五、まとめ(その中で更新情報はまだしていません)
SAX解析事例
必要:xmlドキュメントの各本を一つのbookオブジェクトにパッケージし、複数のオブジェクトを一つのListセットに戻します.
ターゲットxmlドキュメント:
コンテンツプロセッサ:
容器で保存し、xmlの文書を添付し、結果をよく見てください.
xml:
java web開発 [java web開発、 ]
注意「java web開発」の後に2つの空行が格納されています.これは「java web開発」の所在ラベルを解析した後、ラベル間の空行を解析して、直接character方法を実行したためです.countはまだ前回の値です.count==requiredIndexは依然として成立しています.空行でもreltに与えられています.これは初めての結果が空です.
だから、characterメソッドに判断を加える:
dom 4 j解析xml文書:
例:
需要:検索ドキュメントでユーザー名パスワードを指定してユーザー登録に使います.
例:
(注:XPTathに関するものはNode、/すべてを表すもので、ここでSingleNodeが最初です.)
検索用のxmlファイル:
ログイン成功
一つの基本的な学生の成績管理システムは、xmlドキュメントのデータベースを使って、データベースにリアルタイムで添削して学生の成績データを調べることができるように要求しています.
二、需要分析:
1.階層的な定義と実装が必要であり、ユーザー層でユーザーから照会情報を入力し、データの受信を行い、異常な抛り出し、処理とプログラムテストを行い、UI層で未獲得と処理の異常が発生しないことを保証し、不正な入力と操作情報が存在しない場合を正確に処理し、ユーザーに良いユーザ体験を与える.
2.学生パッケージID、name、scoresなどのデータを定義し、学生ツール類を定義し、検索キーワードに基づいて各種学生情報処理を行い、適切に容器を利用して複数の学生オブジェクトを格納し、階層的に抽出して簡略化し、ユーザー層で単純に受信し、呼び出しするだけとする.
三、ドキュメント、各レイヤーのインターフェースと使用する技術
(開発時は逐次更新)
四、具体的な流れの実現
1.xml文書と簡単な学生類:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><exam>
<student examid="222" idcard="111">
<name> </name>
<location> </location>
<grade>89</grade>
</student>
<student examid="444" idcard="333">
<name> </name>
<location> </location>
<grade>89</grade>
</student>
</exam>
文書に基づいて学生の属性をデザインします.package cn.itcast.domain;
public class Student {
private String examid;
private String idcard;
private String name;
private String location;
private double grade;
/**
* @return the examid
*/
String getExamid() {
return examid;
}
/**
* @param examid the examid to set
*/
void setExamid(String examid) {
this.examid = examid;
}
/**
* @return the idcard
*/
String getIdcard() {
return idcard;
}
/**
* @param idcard the idcard to set
*/
void setIdcard(String idcard) {
this.idcard = idcard;
}
/**
* @return the name
*/
String getName() {
return name;
}
/**
* @param name the name to set
*/
void setName(String name) {
this.name = name;
}
/**
* @return the location
*/
String getLocation() {
return location;
}
/**
* @param location the location to set
*/
void setLocation(String location) {
this.location = location;
}
/**
* @return the grade
*/
double getGrade() {
return grade;
}
/**
* @param grade the grade to set
*/
void setGrade(double grade) {
this.grade = grade;
}
}
2.学生工具類の分析:JAXPを利用して入力したキーワード情報に基づいてxml文書の添削を実現します.学生データは全体として、受信処理であれ、データの返却であれ、Studentオブジェクトにカプセル化します.データの呼び出しとパッケージ保存に便利です.(削除は少し違っています.ノード属性値を直接判断して対応ノードを削除すればいいです.)学生の工具類から剥離・抽出する主な機能:各種の処理ニーズの中でJAXPのXPのXLに対する統一操作はツール類にカプセル化して抽出し、特殊な情報を目的に戻すためのカスタム異常類(後に気づく)
操作xmlドキュメントのツールを抽出します.
public class XmlUtils {
// xml Document
public static Document getDocument(String filename) throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
return builder.parse(filename);
}
// Document xml
public static void write2XML(Document document,String filename) throws Exception{
TransformerFactory factory=TransformerFactory.newInstance();
Transformer tf=factory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream(filename)));
}
}
情報の戻り先に特殊なカスタム異常クラス(後に使用):package cn.itcast.exception;
public class StudentNotExistsException extends Exception {
public StudentNotExistsException() {
super();
// TODO Auto-generated constructor stub
}
public StudentNotExistsException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
public StudentNotExistsException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public StudentNotExistsException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
}
学生のツール種類の具体的な実現:使った技術:JAXPとw 3 c.dompackage cn.itcast.dao;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import cn.itcast.domain.Student;
import cn.itcast.exception.StudentNotExistsException;
import cn.itcast.xmlutils.XmlUtils;
public class StudentDao {
private String filename = "src/exam.xml";
public StudentDao(String filename) {
this.filename = filename;
}
/**
* @param filename
* the filename to set
*/
void setFilename(String filename) {
this.filename = filename;
}
//
public void add(Student s) {
try {
//
Document document = XmlUtils.getDocument(filename);
//
Element student_tag = document.createElement("student");
//
student_tag.setAttribute("idcard", s.getIdcard());
student_tag.setAttribute("examid", s.getExamid());
// , ,
Element name = document.createElement("name");
Element location = document.createElement("location");
Element grade = document.createElement("grade");
//
name.setTextContent(s.getName());
location.setTextContent(s.getLocation());
grade.setTextContent(s.getGrade() + "");//
//
student_tag.appendChild(name);
student_tag.appendChild(location);
student_tag.appendChild(grade);
//
document.getElementsByTagName("exam").item(0).appendChild(
student_tag);
//
XmlUtils.write2XML(document, filename);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Student find(String examid) {
try {
Document document = XmlUtils.getDocument(filename);
//
NodeList list = document.getElementsByTagName("student");
for (int i = 0; i < list.getLength(); i++) {
// item Node , Element ,
Element student_tag = (Element) list.item(i);
if (student_tag.getAttribute("examid").equals(examid)) {
Student s = new Student();
s.setExamid(examid);
s.setIdcard(student_tag.getAttribute("idcard"));
s.setName(student_tag.getElementsByTagName("name").item(0)
.getTextContent());
s.setLocation(student_tag.getElementsByTagName("location")
.item(0).getTextContent());
s.setGrade(Double.parseDouble(student_tag
.getElementsByTagName("grade").item(0)
.getTextContent()));
return s;
}
}
return null;
} catch (Exception e) {
throw new RuntimeException(" ");
}
}
// , , !
public void delete(String name) throws StudentNotExistsException {
try {
Document document = XmlUtils.getDocument(filename);
NodeList list = document.getElementsByTagName("name");//
for (int i = 0; i < list.getLength(); i++) {
if (list.item(i).getTextContent().equals(name)) {
list.item(i).getParentNode().getParentNode().removeChild(
list.item(i).getParentNode());
// ,
XmlUtils.write2XML(document, filename);
return;
}
}
throw new StudentNotExistsException(name + " ");
} catch (StudentNotExistsException e) {
// , ,
throw e;
} catch (Exception e) {
throw new RuntimeException(e);// e, , !
}
}
}
3.JUnitテストユニット設定ブレークポイントDebugモードと結合して、直接テストを実行します.削除機能は、削除項目が存在しない場合、Student NotExists Exceptionを抛り出します.正常な実行可能状況です.
package cn.itcast.test;
import org.junit.Test;
import cn.itcast.dao.StudentDao;
import cn.itcast.domain.Student;
import cn.itcast.exception.StudentNotExistsException;
public class JUnitTest {
@Test
public void testAdd() {
StudentDao dao = new StudentDao();
Student s = new Student();
s.setExamid("flsfl");
s.setIdcard("3950");
s.setName("Mrd");
s.setLocation("beijing");
s.setGrade(99);
dao.add(s);
}
@Test
public void testFind() {
StudentDao dao = new StudentDao();
Student s = dao.find("flsfl");
}
@Test
public void testDelete() throws StudentNotExistsException {
StudentDao dao = new StudentDao();
dao.delete("Mrd");
}
}
4.UIユニットpackage cn.itcast.ui;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import cn.itcast.dao.StudentDao;
import cn.itcast.domain.Student;
import cn.itcast.exception.StudentNotExistsException;
public class Main {
public static void main(String[] args) {
try {
StudentDao dao = new StudentDao();
Student s;
while (true) {
System.out.print(" :a b c ");
BufferedReader bf = new BufferedReader(new InputStreamReader(
System.in));
String ss = bf.readLine();
if ("a".equals(ss)) {
s = new Student();// new, !
System.out.print(" :");
s.setExamid(bf.readLine());
System.out.print(" id :");
s.setIdcard(bf.readLine());
System.out.print(" :");
s.setName(bf.readLine());
System.out.print(" :");
s.setLocation(bf.readLine());
System.out.print(" :");
try {
s.setGrade(Double.parseDouble(bf.readLine()));
// , , !!!
dao.add(s);
// add
System.out.println(" ");
} catch (Exception e) {
// , , , ,
System.out.println(" ");
}
} else if ("b".equals(ss)) {
System.out.print(" :");
s = dao.find(bf.readLine());
if (s == null) {
System.out.println(" ");
} else {
System.out.println(" :" + s.getExamid());
System.out.println("id :" + s.getIdcard());
System.out.println(" :" + s.getName());
System.out.println(" :" + s.getLocation());
System.out.println(" :" + s.getGrade());
}
} else if ("c".equals(ss)) {
try {
System.out.print(" :");
dao.delete(bf.readLine());
//
System.out.println(" ");// , , , !
} catch (StudentNotExistsException e) {
System.out.println(e.getMessage());// , , !
}
}
}
} catch (Exception e) {
throw new RuntimeException(" , ");
}
}
}
5.いくつかの簡単なテスト結果(無限循環入力需要)add:
ご要望を入力してください.aを追加します. bクエリー c削除aは受験番号を入力してください.3400534はID番号を入力してください.64392は名前を入力してください.xiabbiは住所を入力してください.beijingはスコアを入力してください.100は成功しました.ご要望を入力してください.aは追加してください. bクエリー c削除
find:
ご要望を入力してください.aを追加します. bクエリー c削除bは受験番号を入力してください.dsfsdは関連情報が見つからないので、ご要望を入力してください.a追加 bクエリー c削除bは受験番号を入力してください.222受験番号:222 id番号:111名前:張三住所:瀋陽成績:89.0はご要望を入力してください.a追加 bクエリー c削除
delete:
ご要望を入力してください.aを追加します. bクエリー c削除c学生の名前を入力してください.sdfsdf sdfこの学生はいません.ご希望を入力してください. bクエリー c削除c学生の名前を入力してください.李四削除に成功しました.ご要望を入力してください.a追加 bクエリー c削除
五、まとめ(その中で更新情報はまだしていません)
SAX解析事例
必要:xmlドキュメントの各本を一つのbookオブジェクトにパッケージし、複数のオブジェクトを一つのListセットに戻します.
ターゲットxmlドキュメント:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>< >
< >
< name=" ">javaweb </ >
< > </ >
< >99.00 </ >
</ >
< >
< >JavaScript </ >
< > </ >
< >28.00 </ >
</ >
< =" " =" " ="aaaa"/><!-- , -->
</ >
分析:1.Bookクラスを作成し、ノード情報をクラスの属性としてパッケージ化し、基本的なsetを提供し、get方法で読み取りと書き込みを行う.package cn.itcast.sax;
public class Book {
private String name;
private String author;
private String price;
/**
* @return the name
*/
String getName() {
return name;
}
/**
* @param name the name to set
*/
void setName(String name) {
this.name = name;
}
/**
* @return the author
*/
String getAuthor() {
return author;
}
/**
* @param author the author to set
*/
void setAuthor(String author) {
this.author = author;
}
/**
* @return the price
*/
String getPrice() {
return price;
}
/**
* @param price the price to set
*/
void setPrice(String price) {
this.price = price;
}
}
2.コンテンツプロセッサパッケージ処理ロジックを作成し、Bookオブジェクトデータを返すためのListを生成する方法を追加的に提供する.class BeanListHandler extends DefaultHandler {
private List list = new ArrayList();
private Book book;
private String currentTag;//
// list get
// set
public List getBooks() {
return list;
}
//
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//
currentTag = qName;
// " ",
if (" ".equals(currentTag)) {// " " ,
book = new Book();
}
}
public void characters(char[] ch, int start, int length)
throws SAXException {
// , " "," "," "
if (" ".equals(currentTag)) {
book.setName(new String(ch, start, length));
}
if (" ".equals(currentTag)) {
book.setAuthor(new String(ch, start, length));
}
if (" ".equals(currentTag)) {
book.setPrice(new String(ch, start, length));
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
// " "
if (" ".equals(qName)) {
list.add(book);
book = null;//
}
currentTag = null;//
}
}
3.SAX解析、テストを作成する//Sax xml
public class SaxDemo {
@Test
public void saxcall() throws ParserConfigurationException, SAXException,
IOException {
//
SAXParserFactory factory = SAXParserFactory.newInstance();
//
SAXParser parser = factory.newSAXParser();
//
XMLReader reader = parser.getXMLReader();
BeanListHandler handler = new BeanListHandler();
reader.setContentHandler(handler);//
//
reader.parse("src/book.xml");
// handler list, (Book )
List<Book> list = handler.getBooks();
System.out.println(list);
}
}
指定されたラベルの内容を取得する-->の中の一つのラベル間の空き内容に起因する問題-->は自分で試して、調整して、慎重に観察して、独りよがりではいけません.もちろんです.コンテンツプロセッサ:
//
class TagValueHandler extends DefaultHandler {
private String currentTag;
private String result = "";
// private List list = new ArrayList();// !
private int requiredIndex = 3;
private int count = 0;
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTag = qName;
// System.out.println(currentTag);
count++;
}
public void characters(char[] ch, int start, int length)
throws SAXException {
if (count == requiredIndex) {
// System.out.println("hello");
result = new String(ch, start, length);
// list.add(result);
// System.out.println(result);
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
}
public String getResult() {
// System.out.println(result);
return result;
// return list;
}
}
テスト方法:@Test
public void saxcall() throws ParserConfigurationException, SAXException,
IOException {
//
SAXParserFactory factory = SAXParserFactory.newInstance();
//
SAXParser parser = factory.newSAXParser();
//
XMLReader reader = parser.getXMLReader();
TagValueHandler had = new TagValueHandler();
reader.setContentHandler(had);
reader.parse("src/book.xml");
System.out.println(had.getResult());
}
テスト結果は空です.容器で保存し、xmlの文書を添付し、結果をよく見てください.
xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>< >
< >
< name=" ">javaweb </ >
< > </ >
< >99.00 </ >
</ >
< >
< >JavaScript </ >
< > </ >
< >28.00 </ >
</ >
< =" " =" " ="aaaa"/><!-- , -->
</ >
//Sax xml
public class SaxDemo {
@Test
public void saxcall() throws ParserConfigurationException, SAXException,
IOException {
//
SAXParserFactory factory = SAXParserFactory.newInstance();
//
SAXParser parser = factory.newSAXParser();
//
XMLReader reader = parser.getXMLReader();
TagValueHandler had = new TagValueHandler();
reader.setContentHandler(had);
reader.parse("src/book.xml");
System.out.println(had.getResult());
}
}
//
class TagValueHandler extends DefaultHandler {
private String currentTag;
private String result = "";
private List list = new ArrayList();// !
private int requiredIndex = 3;
private int count = 0;
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTag = qName;
// System.out.println(currentTag);
count++;
}
public void characters(char[] ch, int start, int length)
throws SAXException {
if (count == requiredIndex) {
// System.out.println("hello");
result = new String(ch, start, length);
list.add(result);
System.out.println(result);
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
}
public List getResult() {
// System.out.println(result);
// return result;
return list;
}
}
結果:java web開発 [java web開発、 ]
注意「java web開発」の後に2つの空行が格納されています.これは「java web開発」の所在ラベルを解析した後、ラベル間の空行を解析して、直接character方法を実行したためです.countはまだ前回の値です.count==requiredIndexは依然として成立しています.空行でもreltに与えられています.これは初めての結果が空です.
だから、characterメソッドに判断を加える:
public void characters(char[] ch, int start, int length)
throws SAXException {
if (count == requiredIndex) {
// System.out.println("hello");
String s = new String(ch, start, length);
s = s.trim();
if (!"".equals(s)) {
result = new String(ch, start, length);
}
// list.add(result);
// System.out.println(result);
}
}
テスト用の容器を取り除いて、データを返す方法を変えて、正確に出力します.結果:java web開発--------->ラベル間の空行に注意しなければなりません.特に、直接character方法を実行して、前のラベルが空になっていないデータを利用しやすいです.dom 4 j解析xml文書:
例:
public static void test(){
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));// File,
Element root=document.getRootElement();//
//achieve the second book
//
Element book=(Element)root.elements(" ").get(1);// ,
String value=book.elementText(" ");
System.out.println(value);
//
Element bookname=book.element(" ");
String value1=bookname.attributeValue("name");//
System.out.println(value1);
//add an element to the first book
Element book0=root.element(" ");
//
book0.addElement(" ").setText("8888 ");
// Document
// : gb2312 utf-8 xml ( xml )
//
// : gb2312 xml gb2312 , utf-8 , utf-8
// xml ,( ) Document utf-8!
XMLWriter writer = new XMLWriter(new OutputStreamWriter(
new FileOutputStream( "src/book.xml" ),"utf-8")
);
// , :
// ( )
writer.write( document );
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
位置を指定して添削します. public static void test2(){
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));// File,
//achieve the second book
Element root=document.getRootElement();//
//
Element book=root.element(" ");// ,
//
//
List list=book.elements();
//
Element price=DocumentHelper.createElement(" ");
price.setText("309 ");
// , index=2 (index 0 )
list.add(2,price);
// ,
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer=new XMLWriter(new FileOutputStream("src/book.xml"),format);
writer.write(document);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// ,
public static void test3(){
try{
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));// File,
//
Element price=document.getRootElement().element(" ").element(" ");
//
price.getParent().remove(price);
//
Element book=(Element)document.getRootElement().elements(" ").get(1);
book.element(" ").setText(" ");
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer=new XMLWriter(new FileOutputStream("src/book.xml"),format);
writer.write(document);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
XPTahはdom 4 j文書と結合して位置を決めます.需要:検索ドキュメントでユーザー名パスワードを指定してユーザー登録に使います.
例:
(注:XPTathに関するものはNode、/すべてを表すもので、ここでSingleNodeが最初です.)
検索用のxmlファイル:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1" username="aaa" password="123" email="[email protected]"></user>
<user id="2" username="bbb" password="136" email="[email protected]"></user>
</users>
検索コード(dom 4 j、xpath)://XPath
public static void test5() throws Exception{
String username="aaa";
String password="123";
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/cn/itcast/dom4j/NewFile.xml"));
// XPath
// !!!
// : , ', " + !!!
Node node=document.selectSingleNode("//user[@username='"+username+"' and @password='"+password+"']");
if(node==null){
System.out.println(" ");
}else{
System.out.println(" ");
}
}
結果:ログイン成功