LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭
java EE开发之Servlet第五课:xml解析
新梦想IT教育 2022-11-03

1. xml简单介绍

数据存储:数据库做存储存在分析和对比,XML做数据存储更加简洁。

数据交换: XML在跨平台、跨语言

数据配置:XML配置快捷、简单


2. DOM(Document Ojbect Modal)解析步骤

2.1 读取

DocumentBuilderFactory->DocumentBuilder->Document

2.2 创建并输出

2.3 XML文档的CRUD操作


3. DOM常见操作

1,读取XML文件中的内容


//读取XML文件中的内容

//创建一个公司

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

//创建队伍

DocumentBuilder bui=factory.newDocumentBuilder();

//获取资源(即你要去哪儿读取数据)

Class c=Class.forName("ReadXML");//forName(本类的名称)

InputStream in=c.getResourceAsStream("Stu.xml");

//创建树

Document doc= bui.parse(in);

in.close();



//取出<stu>节点

NodeList nodes=doc.getElementsByTagName("stu");

for(int i=0;i<nodes.getLength();i++){

//取出<stu>节点的id属性值

Element e=(Element)nodes.item(i);

String id=e.getAttribute("id");


//根据<stu>节点取到<stu>节点下的<name>节点

NodeList nodeList=e.getElementsByTagName("name");

//取出<name>节点下的值

Element el=(Element)nodeList.item(0);

String name=el.getTextContent();


2,往XMl中写入信息


//创建公司

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

//创建队伍

DocumentBuilder bui=factory.newDocumentBuilder();

//创建文档对象

Document doc=bui.newDocument();

//设置版本

doc.setXmlVersion("1.0");



//写入根节点

Element root=doc.createElement("teacher");

doc.appendChild(root);

Scanner input=new Scanner(System.in);

for(int i=0;i<3;i++){

//创建<tea>节点

Element tea=doc.createElement("tea");

System.out.println("请输入老师的编号:");

String id=input.next();

tea.setAttribute("id", id);


//加入属性和<name>节点

Element name=doc.createElement("name");

System.out.println("请输入老师的姓名:");

String n=input.next();

name.setTextContent(n);


tea.appendChild(name);

root.appendChild(tea);

}

//保存XML文件也可调用SaveXML()方法



TransformerFactory fac=TransformerFactory.newInstance();

Transformer tf=fac.newTransformer();



DOMSource source=new DOMSource(doc);

StreamResult result=new StreamResult("f:/teas.xml");

tf.transform(source, result);


3,修改XMl中的信息

//调用得到DOC的方法

Document doc=getDoc();

NodeList nodeList=doc.getElementsByTagName("tea");

for(int i=0;i<nodeList.getLength();i++){

Element el=(Element)nodeList.item(i);

String id=el.getAttribute("id");

if(id.equals(tea.getId())){

NodeList nodes=el.getElementsByTagName("name");

Element name=(Element)nodes.item(0);

name.setTextContent(tea.getName());

break;

}

}



//调用保存的方法

SaveXML(doc);

private static final String FILE="f:/teas.xml";

//得到DOM的方法

public Document getDoc() throws ParserConfigurationException, SAXException,

IOException {

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder bui=factory.newDocumentBuilder();



Document doc=bui.parse(FILE);

return doc;

}

//保存XML文件的方法

private void SaveXML(Document doc)

throws TransformerFactoryConfigurationError,

TransformerConfigurationException, TransformerException {

TransformerFactory factory=TransformerFactory.newInstance();

Transformer tf=factory.newTransformer();


DOMSource source=new DOMSource(doc);

StreamResult result=new StreamResult(FILE);


tf.transform(source, result);

}


3,删除XMl中的信息

//删除方法

public void deleteInfo(String id)throws Exception{

Document doc=getDoc();


doc.getDocumentElement();


NodeList list=doc.getElementsByTagName("tea");

for(int i=0;i<list.getLength();i++){

Element el=(Element)list.item(i);

String ids=el.getAttribute("id");

if(ids.equals(id)){

Element root=doc.getDocumentElement();

root.removeChild(el);


break;

}

}

SaveXML(doc);

}


3.SAX解析:Sax解析是按照xml文件的顺序来解析

SAX(Simple API for XML)是另一种常用的XML解析技术

SAX解析器不像DOM那样建立一个完整的文档树,而是在读取文档时激活一系列事件

这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问

与DOM相比,SAX的优点如下:


内存消耗小

无需为所有节点创建对象


3.1 继承org.xml.sax.helpers.DefaultHandler类创建SAX解析器

3.1.1 startDocument

3.1.2 endDocument

3.1.3 startElement

3.1.4 endElement

3.1.5 characters:处理元素内容时被调用


3.2 详细的操作步骤解释

1.取节点集合:nodeList getElementsByTagName(“name”);然后通过item()下标访问相应的节点

2.取节点元素的属性:elem.getAttribute(“id”)

3.取节点的文本内容:node.getTextContext();

3.创建节点:doc.createElement()

4.添加子节点: 父节点.appendChild(子节点);

5.删除节点: 父节点.removeChild(子节点);

6.修改节点属性: 节点.setAttribute(“name”,value);

7.修改节点文本内容: 节点.setTextContent("");


写一个类,继承:DefaultHandler,实现其五个方法:

//文档开始了

public void startDocument() throws SAXException {

System.out.println("文档开始了");

}

//文档结束了

public void endDocument() throws SAXException {

System.out.println("文档结束了");

}

//元素开始了

public void startElement(String uri, String localName, String  

                  name,Attributes attributes) throws SAXException {

if(name.equals("tea")){

System.out.println("id:" + attributes.getValue("id"));

}

}

//文本开始了

public void characters(char[] ch, int start, int length)

throws SAXException {

String str=new String(ch,start,length);

if(!str.trim().equals("")){

System.out.println("name:" + str);

}

}

//元素结束了

public void endElement(String uri, String localName, String name)

throws SAXException {  }


然后在test方法中


public static void main(String[] args)throws Exception {

SAXParserFactory fac=SAXParserFactory.newInstance();

SAXParser par=fac.newSAXParser();

par.parse("f:/teas.xml", new SaxTest());

}

New SaxTest是一个new出一个类的实类


注意:增删改都需要 反转义进去, 可以增删改的方法里面 就调用 反转义方法。。。调用就更加方便!!!


推荐文章
评论(0)
分享到
转载我的主页