一 XML基础
XML的作用:
作为配置文件
作为数据库
1.1 xml格式
<students>
<student id = "001" >jacky<student>
<student id = "002" >lance<student>
<students>
注释 :
- xml文档中只能有一个根标签
- xml标签对的属性值(id = “001”)
1.2 xml声明
语法:
二 XML解析
XML的解析方式有两种:DOM解析和SAX解析。
2.1 Dom解析
DOM解析原理:xml解析器一次性把整个xml文档加载进内场,然后在内存中构建一颗Document的对象,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。
Dom解析工具:dom4j
首先导入jar包。
使用示例:
//创建xml解析器对象
SAXReader reader = new SAXReader();
//读取xml文档,返回Document对象
Document doc = reader.read(new File(".//src//contact.xml"));
//得到根标签
Element rootElem = doc.getRootElement();
//得到标签名称
String name = rootElem.getName();
//得到当前标签下指定名称的第一个子标签
Element contactEle = rootElem.element("contact");
//得到当前标签下的所有子标签
List<Element> list = rootEle.elements();
//得到当前标签下指定名称的所有子标签
Iterator it = rootEle.elementiterator("contact");
----------
//获取属性 要获取属性先要获取标签对象
//得到指定名称的属性对象
Attribute att = contactEle.attribute("id");
//att.getName() 获取属性名称 att.getValue() 获取属性值
//获取所有的属性对象
List<Attribte> list = contactEle.attributes();
----------
//获取文本 要获取文本先要获取标签对象
Element nameEle = rootEle.getRootElement().element("contact").element("name");
//得到文本
String text = nameEle.getText();
//获取指定子标签的文本内容
String text1 = rootEle.getRootElement().element("contact").elementText("name");
----------
//修改文档
//创建一个文档 DocumentHelp.createDocument();
//增加标签
Element newContact = rootElem.addElement("contact");
//增加属性
Attribute att =newContact.addAttribute("id","002")
//修改属性
att.setValue("003");
//修改文本
nameEle.setText("李四");
//删除属性 得到属性-->删除属性
att.detach();
//删除一个标签对象
nameEle.detach();
----------
//把内存中xml的Document写到文件中
FileOutputStream out = new FileOutputStream(new File("F://contact.xml"));
//指定生成文档的格式
OutputFormat format = OutputFormat.createCompactFormat();//紧凑的格式
//指定生成文档的编码
format.setEncoding("utf-8");
//创建写出对象
XMLWriter writer = new XMLWriter(out,format);
//写出对象
writer.write(doc);
writer.close();
2.2 XPath技术
作用:快速获取所需要的节点对象。
在dom4j中使用XPath技术,导入xPath支持jar包– jaxen-1.1-beta-6.jar(在dom4j包中)
语法:
1. / 表示从xml的根位置或者子元素(一个层级)
2. // 表示不分任何层级的元素
3. * 表示匹配所有元素
4. [] 表示选取什么条件下的元素
5. @ 表示属性
6. text() 表示选取文本内容
7. and 并列关系符
使用方法:
Document doc = new SAXReader().read(new File(.//src//contact.xml));
//获取第一个标签
String xpath = "/";
//所有带有id属性的contact标签
xpath = "//contact[@id]";
//选择所有contace标签中的第二个
xpath = "//contact[2]";
//获取带有id属性的标签
xpath = "//@id";
//获取id属性值为002的contact标签
xpath = "//contact[@id="002"]";
//获取姓名为张三的name标签
xpath = "//contact/name[text()="张三"]"
List<Node> list = doc.selectNodes(xpath);
3.1 SAX解析
SAX解析原理:加载一点,读取一点,处理一点,对内存要求比较低。
使用示例:
public class MyDefaultHandler extends DefaultHandler {
/**
* 开始文档时调用
*/
@Override
public void startDocument() throws SAXException {
System.out.println("MyDefaultHandler.startDocument()");
}
/**
* 开始标签时调用
* @param qName: 表示开始标签的标签名
* @param attributes: 表示开始标签内包含的属性列表
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("MyDefaultHandler.startElement()-->"+qName);
}
/**
* 结束标签时调用
* @param qName: 结束标签的标签名称
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("MyDefaultHandler.endElement()-->"+qName);
}
/**
* 读到文本内容的时调用
* @param ch: 表示当前读完的所有文本内容
* @param start: 表示当前文本内容的开始位置
* @param length: 表示当前文本内容的长度
* char[]( 张三 20) 100
*
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//得到当前文本内容
String content = new String(ch,start,length);
System.out.println("MyDefaultHandler.characters()-->"+content);
}
/**
* 结束文档时调用
*/
@Override
public void endDocument() throws SAXException {
System.out.println("MyDefaultHandler.endDocument()");
}
}
// 创建 SAXParser
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
// 读取xml文件
MyDefaultHandler hander = new MyDefaultHandler();
parser.parser(new File("./src/contact.xml"),handler);