JAXP、saxとdom 4 j解析xmlドキュメントとXXXPSのドキュメントのコンテンツポジショニングにおけるアプリケーション(継続的に更新し、初心者の野路子、参考と想像はもちろん、絶えず学習と専門化)

22736 ワード

JAXPケース
一つの基本的な学生の成績管理システムは、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.dom
package 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("    ");
		}
	}
結果:
ログイン成功