XML(Extensible 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、 不能以xml或XML、Xml开头
4、 不能包含空格
5、 名称中间不能包含(:)
Tip:属性
Xml文件注释:“<!—注释-->”
Tip:CDATA区:在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当做原始内容处理,可以把这些内容放在CDATA区里,对于CDATA区的内容,XML解析引擎不会处理,而是原封不动的输出。
语法:<![CDATA[内容]]>
Tip:转义字符:
&(&)、<(&it)、>(>)、”(")、’(&apos)
Tip:处理指令:简称PI(processing introduction),用来指挥解析引擎如何解析XML文档内容。
如:<?xml-stylesheet type=”text/css” href=”1.css”?>---通知解析引擎,应用css文件显示xml文档内容。
XML声明语句就是最常见的一种处理指令。
Tip:XML约束:在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
常用的约束技术:XML DTD(Document Type Definition,文档类型定义)、XML Schema
检查DTD正确性:可以直接用eclipse校验。
XML编程(C--create R—read U—update D—delete):
XML解析方式有两种:dom(Document Object Model—文档对象模型,适合增删改查,耗内存)、sax(Simple API for XML,占用内存少,解析速度快,只适合做文档的读取,不适合增删改查)
XML解析开发包:Jaxp(SUN)、Jdom、dom4j
调整JVM内存大小:JVM的初始内存大小是64M,超过则内存溢出
调整方式为:启动时在jvm的arguments里加上(-Xml80m)à即在内存开辟了80M的空间
使用Jaxp对XML文档进行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(rootinstanceof 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();
//设置内容处理器(implementsContenthandler或extends DefaultHandler)
reader.setContentHandler( );
//读取XML文档内容
reader.parse("src/book.xml");
}
}
开发中所用方法:
XML:
<?xmlversion="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();
// 设置内容处理器(implementsContenthandler或extends DefaultHandler)
reader.setContentHandler();
// 读取XML文档内容
reader.parse("src/book.xml");
// 把XML文档中的每一本书封装到一个book对象,并把多个book对象放在一个list集合返回
class BeanListHandlerextends DefaultHandler {
privateListlist =newArrayList();
private StringcurrentTag;
private Bookbook;
@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;
}
publicList getList(){
returnlist;
}
}