XML简介
XML的文档结构
1.XML声明
2.XML标签
3.元素
元素由开始标签,结束标签和元素内容组成。元素内容指开始标签和结束标签之间的内容,可以包含子元素,字符数据等。
元素的命名规则如下
- 名称中可以包含字母数字,或者其他符号。
- 名称不能一数字或标点符号开始是。
- 名称不能以字符“”XML“(或者XML,XmL)开始。
- 名称不能包含空格
4.根元素
根元素的特点
- 根元素是一个完全包括文档中其他所有元素的元素。
- 根元素的起始标签要放在所有其他元素的起始标签之前。
- 根元素的结束标签要放在所有其他元素的结束标签之后。
5.属性
6.xml中的特殊字符的处理
7.文档要求
XMl的应用
xml的应用场景主要体现在以下几点
1.数据存储
2.数据交换
3.数据配置
XML解析
目前常用的解析技术有四种
1.DOM
DOM把XML文件映射成一颗倒挂的数,已根元素为根节点,每一个节点都已对象形式存在,通过存取这些对象就能存取XML文档的内容
使用DOM 读取XML数据
/*
解析XML文件
*/
//创建解析器工厂对象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//获得解析对象
DocumentBuilder builder=factory.newDocumentBuilder();
//加载要解析的XML文件
Document doc=builder.parse(new File("手机信息.xml"));//构建DOM树
//操作DOM树: 读取,修改,添加,删除..
/*
getLength():获得节点个数
Item():获得节点集合中的第N个节点
getElementsByTagName(): 根据标签名获得指定的标签[子标签,父标签]
getAttribute((): 获得当前标签的指定属性的值
getTextContent(): 获得当前标签的文本内容
/*
NodeList brands=doc.getElementsByTagName("Brand");//根据标签名获得标签节点
for (int i = 0; i < brands.getLength(); i++) {
//节点: 标签,属性节点,文本节点
Element brand=(Element) brands.item(i);//Brand属于标签节点
String name=brand.getAttribute("name");
//el.getChildNodes();
NodeList types=brand.getElementsByTagName("Type");
for(int j = 0; j < types.getLength(); j++) {
Element type=(Element) types.item(j);//Node向下转型为Element
String typeName=type.getAttribute("name");//获得type标签的name属性值
String price=type.getTextContent();//获得当前标签的文本内容
System.out.println("手机名:"+name+" 型号:"+typeName+" 价格:"+price);
}
}
使用DOM维护XML数据
//创建解析器工厂对象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//获得解析对象
DocumentBuilder builder=factory.newDocumentBuilder();
//加载要解析的XML文件
Document doc=builder.parse(new File("手机信息.xml"));//构建DOM树
//新增节点: 标签节点,属性节点,文本节点
Element newBrand=doc.createElement("Brand");//<Brand></Brand>
newBrand.setAttribute("name", "小米");//<Brand name="小米"></Brand>
Element newType=doc.createElement("Type");//<Type></Type>
newType.setAttribute("name", "Mi10");//<Type name="Mi10"></Type>
newType.setTextContent("2999元");//<Type name="Mi10">2999元</Type>
//将子标签添加到父标签中
newBrand.appendChild(newType);//<Brand name="小米"><Type name="Mi10">2999元</Type></Brand>
//修改节点: 属性,文本
newType.setAttribute("name","mi11");
newType.setTextContent("1999元");
//删除节点: 标签节点,属性节点,文本节点
newType.removeAttribute("name");
newType.setTextContent("");//文本默认为""
//newType.getParentNode().removeChild(newType);//删除当前节点
Node parentNode=newType.getParentNode();
parentNode.removeChild(newType);
//添加节点到DOM树
doc.getElementsByTagName("PhoneInfo").item(0).appendChild(newBrand);
//存储XML信息
DOMSource domSource=new DOMSource(doc);//设置DOM信息
Result rs=new StreamResult(new FileOutputStream(new File("新的手机信息.xml")));//信息存储位置
//格式转换对象
//创建格式转换工厂对象
TransformerFactory ttf=TransformerFactory.newInstance();
//获得格式转换对象
Transformer transformer=ttf.newTransformer();
//设置转换格式
transformer.setOutputProperty(OutputKeys.VERSION, "1.0");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//转换: 将DOM信息,转到磁盘文件中
transformer.transform(domSource, rs);
2.SAX
SAX是基于时间的解析,他是解决DOM解析的资源消耗而出现的,它不像DOM那样需要建立一颗完整的文档树,而是通过时间处理器完成对文档的解析, 以为SAX解析不用事先调入整个文档,所以他的优势就是占用资源少,消耗内存小,一般在解析数据量大的XML文档是会采用。
3.JDOM
4.DOM4J
使用DOM4j解析XML
//创建解析器
SAXReader saxReader=new SAXReader();
//加载指定XML文件
Document doc=saxReader.read("手机信息.xml");
//获得根标签
Element root=doc.getRootElement();
//解析XML信息
System.out.println(doc.asXML());
/*List<Element> brands=root.elements("Brand");
for (Element element : brands) {
//element.attribute("name").getValue();
String name=element.attributeValue("name");
List<Element> types=element.elements("Type");
for (Element type : types) {
String typeName=type.attributeValue("name");
String price=type.getTextTrim();
System.out.println("品牌:"+name+" 类型:"+typeName+" 价格:"+price);
}
}*/
//添加节点:
Element newBrand=root.addElement("Brand");//<Brand></Brand>
newBrand.setAttributeValue("name", "小米");//<Brand name="小米"></Brand>
Element newType=newBrand.addElement("Type");//<Brand name="小米"><Type></Type></Brand>
newType.setAttributeValue("name", "mi10");//<Brand name="小米"><Type name="mi10"></Type></Brand>
newType.setText("1999元");//<Brand name="小米"><Type name="mi10">1999元</Type></Brand>
//修改节点:
newType.setAttributeValue("name", "mi11");
newType.setText("3999元");
//newBrand.remove(newType);
newType.getParent().remove(newType);
//删除节点:
newType.remove(newType.attribute("name"));
newType.setText("");//remove(Text对象);
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("新手机信息.xml"), format);
xmlWriter.write(doc);
xmlWriter.close();