黑马程序员__javawebXML及Jaxp解析XML

---------------------- android培训java培训、期待与您交流! ----------------------

XMLExtensible Markup Language):可扩展标记语言,w3c组织发布,目前遵循2000年发布的XML1.0规范!

XML文件分为:文档声明、元素、属性、注释、CDATA区、特殊字符、处理指令

processing introduction

文档声明:<?xml version=”1.0” encoding=”GB2312” standalone=”yes”?>

standalone说明文档是否独立。

XML元素:XML文件中出现的标签,一个标签分为开始标签和结束标签。

格式良好的XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子孙标签。

一个XML元素可以包含字母、数字以及其他一些可见字符,但必须遵守:

1、 区分大小写

2、 不能以数字或“_”(下划线)开头

3、 不能以xmlXMLXml开头

4、 不能包含空格

5、 名称中间不能包含(:)

Tip:属性

Xml文件注释:“<!—注释-->

TipCDATA区:在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当做原始内容处理,可以把这些内容放在CDATA区里,对于CDATA区的内容,XML解析引擎不会处理,而是原封不动的输出。

语法:<![CDATA[内容]]>

Tip:转义字符:

&&amp)、<(&it)>(&gt)”(&quot)’(&apos)

Tip:处理指令:简称PIprocessing introduction),用来指挥解析引擎如何解析XML文档内容。

如:<?xml-stylesheet type=”text/css” href=”1.css”?>---通知解析引擎,应用css文件显示xml文档内容。

XML声明语句就是最常见的一种处理指令。

TipXML约束:在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。

常用的约束技术:XML DTDDocument Type Definition,文档类型定义)、XML Schema

检查DTD正确性:可以直接用eclipse校验。

XML编程(C--create R—read U—update D—delete):

XML解析方式有两种:domDocument Object Model—文档对象模型,适合增删改查,耗内存)、saxSimple API for XML,占用内存少,解析速度快,只适合做文档的读取,不适合增删改查)

XML解析开发包:JaxpSUN)、Jdomdom4j

调整JVM内存大小:JVM的初始内存大小是64M,超过则内存溢出

调整方式为:启动时在jvmarguments里加上(-Xml80m)à即在内存开辟了80M的空间

使用JaxpXML文档进行dom解析:

1、 创建工厂

2、 得到dom解析器

3、 解析XML文档,得到代表文档的document

publicvoid test() throws ParserConfigurationException, SAXException, IOException{

//打印XML中的所有标签

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();

Document document=builder.parse("src/book.xml");

Node root=document.getElementsByTagName("书架").item(0);

list(root);

}

privatevoid list(Node root) {

if(root instanceof Element){

System.out.println(root.getNodeName());

}

NodeList list=root.getChildNodes();

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

Node child=list.item(i);

list(child);

}

}

}

@Test//XML文档中添加节点:<售价>59.00</售价>

publicvoid add() throws SAXException, IOException, ParserConfigurationException, TransformerException{

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();

Document document=builder.parse("src/book.xml");

//创建节点

Element price= document.createElement("售价");

price.setTextContent("59.00");

//把创建的节点挂在第一本书上

Element book=(Element) document.getElementsByTagName("").item(0);

book.appendChild(price);

//把更新后内存写回XML文档

TransformerFactory tffactory=TransformerFactory.newInstance();

Transformer tf=tffactory.newTransformer();

tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));

}

//向文档中指定位置添加节点

@Test

publicvoid test2() throws ParserConfigurationException, SAXException, IOException, TransformerException{

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();

Document document=builder.parse("src/book.xml");

//创建节点

Element price=document.createElement("售价");

price.setTextContent("59.00");

//得到参考节点

Element refNode=(Element) document.getElementsByTagName("售价").item(0);

//得到要悬挂的节点

Element book=(Element) document.getElementsByTagName("").item(0);

//往节点指定位置插崽

book.insertBefore(price, refNode);

//把更新后内存写回XML文档

TransformerFactory tffactory=TransformerFactory.newInstance();

Transformer tf=tffactory.newTransformer();

tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));

}

/*

节点上添加属性

Element bookName=(Element)document.getElementsByTagName("书名").item(0);

bookName.setAttribute("name","XXXXX");*/

/* 删除节点

得到要删除的节点

Element e=(Element)document.getElementBytagName("售价").item(0);

得到要删除节点的爸爸,再删除儿子节点

e.getParentNode().removeChild(e);*/

/* 更新

Element e=(Element)document.getElementByTagName("售价").item(0);

e.setTexttextContent("109");*/

}

SAX解析(JAXP):

publicstaticvoid main(String[] args) throws ParserConfigurationException, SAXException, IOException{

//获得解析工厂

SAXParserFactory factory= SAXParserFactory.newInstance();

//得到解析器

SAXParser sp=factory.newSAXParser();

//得到读取器

XMLReader reader=sp.getXMLReader();

//设置内容处理器(implements Contenthandlerextends DefaultHandler)

reader.setContentHandler( );

//读取XML文档内容

reader.parse("src/book.xml");

}

}

开发中所用方法:

XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>

<>

<书名 name="XXXXX">Java就业培训教程</书名>

<作者>张孝祥</作者>

<售价>59.00</售价>

<售价>109</售价>

<售价>59.00</售价></>

<>

<书名>JavaScript网页开发</书名>

<作者>张孝祥</作者>

<售价>28.00</售价>

</>

</书架>

publicstaticvoid main(String[] args) {

// 获得解析工厂

SAXParserFactory factory = SAXParserFactory.newInstance();

// 得到解析器

SAXParser sp = factory.newSAXParser();

// 得到读取器

XMLReader reader = sp.getXMLReader();

// 设置内容处理器(implements Contenthandlerextends DefaultHandler)

reader.setContentHandler();

// 读取XML文档内容

reader.parse("src/book.xml");

// XML文档中的每一本书封装到一个book对象,并把多个book对象放在一个list集合返回

class BeanListHandler extends DefaultHandler {

private List list = new ArrayList();

private String currentTag;

private Book book;

@Override

publicvoid startElement(String uri, String localName, String name,

Attributes attributes) throws SAXException {

// TODO Auto-generated method stub

currentTag = name;

if ("".equals(currentTag)) {

book = new Book();

}

}

@Override

publicvoid characters(char[] ch, int start, int length)

throws SAXException {

if ("书名".equals(currentTag)) {

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

book.setName(name);

}

if ("作者".equals(currentTag)) {

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

book.setAuthor(author);

}

if ("售价".equals(currentTag)) {

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

book.setAuthor(price);

}

}

@Override

publicvoid endElement(String uri, String localName, String qName)

throws SAXException {

if (name.equals("")) {

list.add(book);

book = null;

}

currentTag = null;

}

public List getList(){

returnlist;

}

}

--------------------- android培训java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值