javaWeb 学习之旅(二)--------XML的使用方法

来源:互联网 发布:ipad画漫画软件 编辑:程序博客网 时间:2024/05/29 12:19

二、xml的使用方法

 1.最简单的声明语法:

<?xml version="1.0"?>

常用的方法有:<?xml version="1.0" encoding="UTF-8"?>或者<?xml version="1.0" encoding="GB2312"?>

还有一个属性:说明文档是否独立      standalone="yes"

CDATA区: xml解析程序不会处理,按原样输出,语法如下: <![CDATA[内容]]>

2.DTD约束

book.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE 书架 SYSTEM "book.dtd"><书架><书><书名> 数据结构</书名><作者> 某某某</作者></书><书><书名> 大学语文</书名><作者> 某某某</作者></书></书架>

book.dtd

<!ELEMENT 书架(书+)><!ELEMENT 书 (书名,作者)><!ELEMENT 书名 (#PCDATA)><!ELEMENT 作者 (#PCDATA)>

 

2.Dom和Sax解析方法的区别:

1.Dom 解析的优点,对文档的增、删、改、查、比较方便,缺点占用的内存较大

2.Sax解析的优点是占用内存少, 解析速度快,缺点是只适合做文档的读取,不适合做文档的增、删、改、查、

3.调整JVM的大小

             JVM默认的是64M的内存,超过之后,后抛出异常

            配置JVM的大小如下: run as  --Open   Run  Dialog -----------Argument----- VM argument 中输入  -Xmx90m          这样就可以配置90M的内存  

4.XML解析技术

XML的解析开发包如下: Jaxp(Sun)   Jdom    dom4j

1.DOM解析步骤:

得到XML文档
//  1.创建工厂  DocumentBuilderFactory  factory=DocumentBuilderFactory.newInstance();//  2.得到dom解析器  DocumentBuilder builder=factory.newDocumentBuilder();//  3.解析xml文档,得到代表文档的document  Document document=builder.parse("src/test.xml");

更新后的内容重新写入XML文档中

// 更新后的内容写会XML文档中TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/test.xml")));


XML中的一些方法

获取属性的

// 得到根节点Element element = (Element) document.getElementsByTagName("书名").item(0);String value = element.getAttribute("name");System.out.println(value);

在指定位置增加节点元素

// 创建节点Element print = document.createElement("出版社");print.setTextContent("南阳理工学院");//注意一下:这里的“作者”是在xml文档中从“0”开始算起 出现的第几次,Element bookElement = (Element) document.getElementsByTagName("作者").item(1);//注意一下:这里的“书”是在xml文档中从“0”开始算起 出现的第几次,Element rootElement = (Element) document.getElementsByTagName("书").item(1);rootElement.insertBefore(print, bookElement);

指定位置增加属性

                Element bookname = (Element) document.getElementsByTagName("书名").item(1);bookname.setAttribute("name", "book");

删除节点元素

//注意一下:这里的“作者”是在xml文档中从“0”开始算起 出现的第几次,Element deleteElement = (Element) document.getElementsByTagName("作者").item(3);//注意一下:这里的“书”是在xml文档中从“0”开始算起 出现的第几次,Element rootElement = (Element) document.getElementsByTagName("书").item(3);//这个方法是删除所在元素的节点//deleteElement.getParentNode().getParentNode().removeChild(deleteElement.getParentNode());rootElement.removeChild(deleteElement);

更新节点元素内容


//注意一下:这里的“作者”是在xml文档中从“0”开始算起 出现的第几次,Element updateElement = (Element) document.getElementsByTagName("作者").item(3);updateElement.setTextContent("wangjie");


2.例子 用java实现的学生成绩系统,实现对XML文件进行增、删、改、查



 


 

实现的过程如下:

XmlUtils.java     有得到XML文档的方法和保存更新后XML文档的方法

 

public class XmlUtils {      //有得到XML文档的方法private static String filename = "src/exam.xml";public static Document getdDocument() throws Exception {DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();return builder.parse(filename);}      //保存更新后XML文档的方法public static void write2Xml(Document document) throws Exception {TransformerFactory factory = TransformerFactory.newInstance();Transformer transformer = factory.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream(filename)));}}


Student.java   是用来保存 javabean  的Get和Set的方法

public class Student {private String id;private String examid;private String name;private String location;private double grade;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getExamid() {return examid;}public void setExamid(String examid) {this.examid = examid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}public double getGrade() {return grade;}public void setGrade(double grade) {this.grade = grade;}}


然后是实现增、删、改、查的模块StudentDao.java

 

package com.nyist.student.Dao;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.jar.Attributes.Name;import org.junit.Test;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import com.nyist.Exception.StudentNotException;import com.nyist.XmlUtils.XmlUtils;import com.nyist.student.bean.Student;public class StudentDao {@Testpublic void add(Student student) {try {Document document = XmlUtils.getdDocument();// 创建出封装学生信息的标签Element student_tag = document.createElement("student");student_tag.setAttribute("id", student.getId());student_tag.setAttribute("examid", student.getExamid());// 创建用于封装学生姓名所在地、成绩的标签Element name = document.createElement("name");Element location = document.createElement("location");Element grade = document.createElement("grade");name.setTextContent(student.getName());location.setTextContent(student.getLocation());grade.setTextContent(student.getGrade() + "");student_tag.appendChild(name);student_tag.appendChild(location);student_tag.appendChild(grade);// 把封装的了信息学生标签,挂到文档上document.getElementsByTagName("exam").item(0).appendChild(student_tag);// 更新内存XmlUtils.write2Xml(document);} catch (Exception e) {}}public Student find(String examid) {Student student = new Student();try {Document document = XmlUtils.getdDocument();NodeList list = document.getElementsByTagName("student");for (int i = 0; i < list.getLength(); i++) {Element student_tagElement = (Element) list.item(i);if (student_tagElement.getAttribute("examid").equals(examid)) {student.setExamid(examid);student.setId(student_tagElement.getAttribute("id"));student.setName(student_tagElement.getElementsByTagName("name").item(0).getTextContent());student.setLocation(student_tagElement.getElementsByTagName("location").item(0).getTextContent());student.setGrade(Double.parseDouble(student_tagElement.getElementsByTagName("grade").item(0).getTextContent()));System.out.println("准考证号:" + student.getExamid() + "\n"+ "姓名:" + student.getName() + "\n" + "学号:"+ student.getId() + "\n" + "所在地:"+ student.getLocation() + "\n" + "成绩:"+ student.getGrade());return student;}}} catch (Exception e) {// TODO Auto-generated catch blockthrow new RuntimeException(e);}return null;}public void delete(String name) throws StudentNotException {try {Document document = XmlUtils.getdDocument();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);return;}}throw new StudentNotException(name + "该学生信息不存在!!");} catch (StudentNotException e) {// TODO Auto-generated catch blockthrow e;} catch (Exception e) {// TODO Auto-generated catch blockthrow new RuntimeException(e);}}}


最后是主界面,实现增删改查的交互功能main.java


 

package com.nyist.ui;import java.io.BufferedReader;import java.io.InputStreamReader;import com.nyist.student.Dao.StudentDao;import com.nyist.student.bean.Student;public class main {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubtry {System.out.println("添加学生(a)  删除学生(b)  查找学生(c)  修改(d)   ");System.out.print("请输入操作类型");BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));String type = bufferedReader.readLine();//增加学生信息的操作if ("a".equals(type)) {System.out.print("请输入学生的姓名");String name = bufferedReader.readLine();System.out.print("请输入学生的ID");String id = bufferedReader.readLine();System.out.print("请输入学生的准考证号");String examid = bufferedReader.readLine();System.out.print("请输入学生的所在地");String location = bufferedReader.readLine();System.out.print("请输入学生的成绩");String grade = bufferedReader.readLine();Student student = new Student();student.setExamid(examid);student.setId(id);student.setLocation(location);student.setName(name);student.setGrade(Double.parseDouble(grade));StudentDao dao = new StudentDao();dao.add(student);System.out.println("添加成功!!");} //删除学生信息的操作else if ("b".equals(type)) {System.out.println("请输入要删除学生的姓名");String name = bufferedReader.readLine();try {StudentDao dao = new StudentDao();dao.delete(name);System.out.println("删除成功!!");} catch (Exception e) {// TODO: handle exceptionSystem.out.println("你要删除的学生不存在!!");}}//查找学生信息的操作else if ("c".equals(type)) {System.out.println("请输入要查找学生的准考证号");String examid = bufferedReader.readLine();try {StudentDao dao = new StudentDao();dao.find(examid);System.out.println("查找成功!!");} catch (Exception e) {// TODO: handle exceptionSystem.out.println("你要查找的学生不存在!!");}}//删除学生信息的操作else if ("d".equals(type)) {System.out.println("请输入要更新学生的姓名");String name = bufferedReader.readLine();try {StudentDao dao = new StudentDao();dao.delete(name);System.out.print("请输入学生的ID");String id = bufferedReader.readLine();System.out.print("请输入学生的准考证号");String examid = bufferedReader.readLine();System.out.print("请输入学生的所在地");String location = bufferedReader.readLine();System.out.print("请输入学生的成绩");String grade = bufferedReader.readLine();Student student = new Student();student.setExamid(examid);student.setId(id);student.setLocation(location);student.setName(name);student.setGrade(Double.parseDouble(grade));dao.add(student);System.out.println("更新成功!!");} catch (Exception e) {// TODO: handle exceptionSystem.out.println("你要更新的学生不存在!!");}}else {System.out.println("不支持这个操作!!");}} catch (Exception e) {// TODO: handle exceptionSystem.out.println("亲,出错了");}}}


其中用到一个异常的处理类 StudentNotException.java 是继承了exception的方法

package com.nyist.Exception;public class StudentNotException extends Exception {public StudentNotException() {// TODO Auto-generated constructor stub}public StudentNotException(String message) {super(message);// TODO Auto-generated constructor stub}public StudentNotException(Throwable cause) {super(cause);// TODO Auto-generated constructor stub}public StudentNotException(String message, Throwable cause) {super(message, cause);// TODO Auto-generated constructor stub}}

 

保存数据的XML文件如下:exam.xml


<?xml version="1.0" encoding="UTF-8" standalone="no"?><exam><student examid="100" id="001"><name>张三</name><location>南阳</location><grade>22</grade></student><student examid="101" id="002"><name>王某某</name><location>南阳</location><grade>21</grade></student><student examid="102" id="003"><name>李某某</name><location>南阳</location><grade>23</grade></student><student examid="111" id="111"><name>wangjie</name><location>111</location><grade>111.0</grade></student></exam>


工程包下载地址:http://download.csdn.net/detail/wjky2014/5220366

 

3.SAX解析XML技术

SAX解析XML技术的步骤

                // 1.创建解析工厂SAXParserFactory factory = SAXParserFactory.newInstance();// 2.得到解析器SAXParser saxParser = factory.newSAXParser();// 3.得到读取器XMLReader reader = saxParser.getXMLReader();// 4.设置内容处理器beanListHandler handler = new beanListHandler();reader.setContentHandler(handler);// 5.读取xml文档的内容reader.parse("src/test.xml");List<Book> list = handler.getbooks();System.out.println(list);

 
然后把XML文档中的每一本书封装的一个book对象中,并封装到list中

// 把XML文档中的每一本书封装的一个book对象中,并封装到list中class beanListHandler extends DefaultHandler {private List list = new ArrayList();private String currenttag;private Book book;@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {currenttag = qName;if ("书".equals(currenttag)) {book = new Book();}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if ("书名".equals(currenttag)) {String name = new String(ch, start, length);book.setName(name);System.out.println(name);}if ("作者".equals(currenttag)) {String author = new String(ch, start, length);book.setAuthor(author);System.out.println(author);}if ("售价".equals(currenttag)) {String prize = new String(ch, start, length);book.setPrize(prize);System.out.println(prize);}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {if (qName.equals("书")) {list.add(book);book = null;}currenttag = null;}// 得到list集合public List getbooks() {return list;}用javabean的方法封装XML文档类的Book.javapackage com.nyist.sax;public class Book {private String name;private String author;private String prize;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getPrize() {return prize;}public void setPrize(String prize) {this.prize = prize;}}





测试的XML文件如下:
test.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架><书><书名>android 开发</书名><作者>王宇</作者><售价>32元</售价></书><书><书名 > 数据结构</书名><作者>王小米</作者><售价>40元</售价></书><书><书名 > 大学英语</书名><作者>王大米</作者><售价>50元</售价></书></书架>

4.Dom4j  实现对xml 文件的增、删、改、查、的功能

dom4j   解析XML文档的步骤
需要用到的jar包是:dom4j-1.6.1.jar
下载地址

1.首先的读取XML文件
 
                SAXReader reader = new SAXReader();Document document = reader.read(new File("src/test.xml"));

2.实现增、删、查、改的功能

指定位置增加一个节点的方法
Element book = (Element) document.getRootElement().elements("书").get(2);List list = book.elements();Element location = DocumentHelper.createElement("出版社");location.setText("人民日报出版社");list.add(location)
删除一个节点的方法
Element book = (Element) document.getRootElement().elements("书").get(2);book.getParent().remove(book);

更新一节点的方法
Element book = (Element) document.getRootElement().elements("书").get(1);book.element("出版社").setText("南阳理工学院");
 
具体实现的一个例子如下,还是用的上面的test.xml 文件

@Test// 得到xml文档的内容public void read() throws DocumentException {SAXReader reader = new SAXReader();Document document = reader.read(new File("src/test.xml"));Element root = document.getRootElement();Element book = (Element) root.elements().get(1);String value = book.element("书名").getText();System.out.println(value);}@Test// 得到xml文档的的属性public void readAttr() throws DocumentException {SAXReader reader = new SAXReader();Document document = reader.read(new File("src/test.xml"));Element root = document.getRootElement();Element book = (Element) root.elements().get(1);String value = book.element("书名").attributeValue("name");System.out.println(value);}@Testpublic void add() throws Exception {SAXReader reader = new SAXReader();Document document = reader.read(new File("src/test.xml"));Element book = (Element) document.getRootElement().elements("书").get(1);book.addElement("出版社").setText("人民日报出版社");OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");// 第一种方法// XMLWriter writer=new XMLWriter(new OutputStreamWriter(new// FileOutputStream("src/test.xml"), "UTF-8"));// 第二种方法XMLWriter writer = new XMLWriter(new FileOutputStream("src/test.xml"),format);writer.write(document);writer.close();}// 在制定位置添加@Testpublic void add2() throws Exception {SAXReader reader = new SAXReader();Document document = reader.read(new File("src/test.xml"));Element book = (Element) document.getRootElement().elements("书").get(2);List list = book.elements();Element location = DocumentHelper.createElement("出版社");location.setText("人民日报出版社");list.add(location);OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");// 第一种方法// XMLWriter writer=new XMLWriter(new OutputStreamWriter(new// FileOutputStream("src/test.xml"), "UTF-8"));// 第二种方法XMLWriter writer = new XMLWriter(new FileOutputStream("src/test.xml"),format);writer.write(document);writer.close();}// 删除添加的节点@Testpublic void delete() throws Exception {SAXReader reader = new SAXReader();Document document = reader.read(new File("src/test.xml"));Element book = (Element) document.getRootElement().elements("书").get(2);book.getParent().remove(book);OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");// 第一种方法// XMLWriter writer=new XMLWriter(new OutputStreamWriter(new// FileOutputStream("src/test.xml"), "UTF-8"));// 第二种方法XMLWriter writer = new XMLWriter(new FileOutputStream("src/test.xml"),format);writer.write(document);writer.close();}// 更新节点@Testpublic void update() throws Exception {SAXReader reader = new SAXReader();Document document = reader.read(new File("src/test.xml"));Element book = (Element) document.getRootElement().elements("书").get(1);book.element("出版社").setText("南阳理工学院");OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");// 第一种方法// XMLWriter writer=new XMLWriter(new OutputStreamWriter(new// FileOutputStream("src/test.xml"), "UTF-8"));// 第二种方法XMLWriter writer = new XMLWriter(new FileOutputStream("src/test.xml"),format);writer.write(document);writer.close();}

5.用Xpath提取XML文档的数据

需要用的的jar包是jaxen-1.1.1.zip
下载地址如下:
简单的例子是实现登陆的用户名和密码的使用
/** * 查找user.xml 文档是否有用户相匹配的用户名和密码 *  * @throws DocumentException *  */public static void main(String[] args) throws DocumentException {// TODO Auto-generated method stubString username = "wangjie";String password = "123456";// 检测XML文档中是否有匹配的用户名和密码SAXReader reader = new SAXReader();Document document = reader.read(new File("src/user.xml"));Node node = document.selectSingleNode("//user[@username='" + username+ "'and @password='" + password + "']");if (node == null) {System.out.println("用户名和密码错误!!");} else {System.out.println("登陆成功!!");}}

user.xml文件如下

<?xml version="1.0" encoding="UTF-8"?><users><user id="1" username="wangjie" password="123456" email="1150580768@qq.com" /><user id="2" username="wang" password="123456" email="1150580768@qq.com" /></users>


6. XML Schema

XML Schema 用于定义和描述XML文档结构与内容的模式语言,克服了DTD的局限性,但不能行DTD一样定义实体,比DTD更复杂,但是XML Schema 已经是W 3c 组织的标准,正在逐步取代DTD
XML Schema语法:
   1.扩展名必须为*.xsd   
    2.XML Schema 必须有一个根节点,名称为  Schema
   3.编写一个XML Schema 约束文档后,通常需要把这个文件中的元素绑定到一个URI 地址上,即把XML Schema 文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(即名称空间)Uniform  Resource Identity 来告诉解析引擎,xml 文档中的编写元素来自哪里,被谁约束。。
 
名称空间(URI)
名称空间的声明(xmlns) ,声明当前标签来自哪个Schema  约束文档。。
 

5.打印图形M 

 图形类的东西都是平面图形题,可以使用二维数组解决问题
/** * 打印  M * 这样的东西都是平面图形题 * 可以使用二维数组解决问题 *  *     3   7            *    2 4 6 8           *   1   5   9          *    * **/public static void main(String[] args) {int num = 13;int height = num / 4 + 1;int width = num;int arr[][] = new int[height][width];int x = height - 1;int y = 0;boolean order = false;for (int i = 1; i <= num; i++) {arr[x][y] = i;y++;if (order == false) {x--;}if (order == true) {x++;}if (x < 0) {order = true;x = x + 2;}if (x > height - 1) {order = false;x = x - 2;}}for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {if (arr[i][j] == 0) {System.out.print("  ");} else {System.out.print(arr[i][j]);}}System.out.println();}}