2.1XML简介
XML是Extensible Markup Language 的缩写,即可扩展标记语言,是一种简单的数据存储语音,使用一系列简答的标记来描述结构化数据。
XML的特点:
XML与操作系统,编程语言的开发平台都无关。
规范统一,实现不同系统之间的数据交互。
XML技术应用广泛,最基本的如网站、应用程序的配置信息一般采用XML文件描述。
使用DOM读取XML数据
可以使用Oracle公司提供的jaxp来解析XML,java包含3个包,这三个包都在JDK中:
1:org.w3c.dom:推荐用于使用DOM解析XML文档的接口
2:org.xml.sax:用于使用SAX解析XML文档的接口
3:javax.xml.parsers:解析器工厂工具,获得并配置特殊的分析器.
在使用DOM解析XML时需要导入这些包中相关的类,jaxp会把XML文档转换成一个DOM树,使用dom解析xml文档步骤:
创建解析工厂对象,即DocumentBuilderFactory对象
由解析器工厂对创建解析器对象,即DocumentBuilder对象
由解析器对象对指定的XML文件进行解析,构建相对应的DOM树,创建Document对象。
以Document对象为起点多DOM树的节点进行增删改查等操作
XML文档代码如下:
<PhoneInfo><!--根元素-->
<Brand name="华为"><!--元素--><!--name="属性"-->
<Type name="P90"/>
</Brand>
<Brand name="苹果">
<Type name="iPhone Z"/>
<Type name="iPhone ZL"/>
</Brand>
</PhoneInfo>
解析关键代码:
public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
//得到DOM解析器的工厂实例
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//从DOM工厂获得DOM解析器
DocumentBuilder db=dbf.newDocumentBuilder();
//解析XML文档,得到一个Document对象,即DOMshu
Document doc=db.parse(“BooK/Brand.xml”);
//得到所有Brand节点列表信息
NodeList brandList=doc.getElementsByTagName(“Brand”);
//循环Brand信息
for (int i = 0; i < brandList.getLength(); i++) {
//获取第i个Brand元素信息
Node brand=brandList.item(i);
//获取第i个Brand元素的name属性的值
Element element=(Element) brand;
String attr=element.getAttribute(“name”);
//获取第i个Brand元素的所有子元素的name属性值
NodeList types=element.getChildNodes();
for (int j = 0; j <types.getLength() ; j++) {
Node typeNode = types.item(j);//type节点
if(typeNode.getNodeType()==Node.ELEMENT_NODE){
Element type=((Element) types.item(j));
String ty=type.getAttribute(“name”);//获得手机型号
System.out.println(“手机:”+attr+ty);
}
}
}
}
输出结果:在这里插入图片描述
Nede对象主要方法如下:
getChildNodes();返回包含此节点所有子节点的NodeList
getFirstChild():如果节点存在子节点,则返回第一个子节点
getLastChild():如果节点存在子节点,则返回最后一个子节点
getNextSibLing():返回在DOM树中这个节点的下一个兄弟节点
getPreviousSibLing():返回在DOM树中这个节点的上一个兄弟节点
getNodeName():返回节点名称
getNodeValue():返回节点的值
getNodeType():返回节点的类型
NodeList对象
顾名思义,包含一个或多个节点的列表,可以看成一个Node数组
1:getLength():返回列表的长度
2:item(int index):返回指定为之的Node对象
添删改信息:
实现步骤:
- 为XML文档构造DOM树
- 创建新节点,并设置name属性
- 把节点添加到其所属父节点上
- 保存XML文档
关键代码:
public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException, TransformerException {
//得到DOM解析器的工厂实例
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//从工厂获得解析器
DocumentBuilder db=dbf.newDocumentBuilder();
//解析XML得到一个Document对象即DOM树
Document doc=db.parse(“BooK/Brand.xml”);
//Insert(doc);
// Update(doc);
//Delete(doc);
}
//添加
public static void Insert(Document doc) throws TransformerException, FileNotFoundException {
//创建Brand节点
Element type=doc.createElement(“Brand”);
type.setAttribute(“name”,“三星”);
//创建TYPE节点
Element ty=doc.createElement(“Type”);
ty.setAttribute(“name”,“NoteS”);
//添加父子关系
type.appendChild(ty);
Element ph=(Element)doc.getElementsByTagName(“PhoneInfo”).item(0);
ph.appendChild(type);
baocun(doc);
}
//保存XML文件
public static void baocun(Document doc) throws TransformerException, FileNotFoundException {
//保存XML文件
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
DOMSource domSource=new DOMSource(doc);
//设置编码方式
transformer.setOutputProperty(OutputKeys.ENCODING,“UTF-8”);
StreamResult result=new StreamResult((new FileOutputStream(“BooK/Brand.xml”)));
//把DOM树转换为XML文件
transformer.transform(domSource,result);
}
//删除
public static void Delete(Document doc){
NodeList list=doc.getElementsByTagName(“Brand”);
for (int i = 0; i <list.getLength() ; i++) {
Element brand=(Element)list.item(i);
String brandName=brand.getAttribute(“name”);
if (brandName.equals(“SAMSUNG”)){
brand.getParentNode().removeChild(brand);
}
}
try {
baocun(doc);
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
//修改
public static void Update(Document doc){
NodeList list=doc.getElementsByTagName(“Brand”);
for (int i = 0; i <list.getLength() ; i++) {
Element brand=(Element)list.item(i);
String brandName=brand.getAttribute(“name”);
System.out.print(brandName);
if (brandName.equals(“三星”)){
brand.setAttribute(“name”,“SAMSUNG”);//修改属性
}
}
try {
baocun(doc);
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}