Java XML
一、XML简介
XML(EXtensible Markup Language),可扩展标记语言
特点:
① XML与操作系统、编程语言的开发平台无关。
② 实现不同系统之间的数据交换。
作用:
① 数据交互。
② 配置应用程序和网站。
③ Ajax基石。
二、文档结构
<?xml version="1.0" encoding="UTF-8"?>
<PhoneInfo>
<Brand name="华为">
<Type name="U8650"/>
<Type name="HW123"/>
<Type name="HW321"/>
</Brand>
<Brand name="苹果">
<Type name="iPhone4"/>
</Brand>
</PhoneInfo>
<元素名 属性名=“属性值”>元素内容</元素名>
① 属性值用双引号包裹。
② 一个元素可以有多个属性。
③ 属性值中不能直接包含<、“、&。
④ 不建议使用的字符:‘、>。
注意事项:
① 所有XML元素都必须有结束标签。
② XML标签对大小写敏感。
③ XML必须正确的嵌套。
④ 同级标签以缩进对齐。
⑤ 元素名称可以包含字母、数字或其他的字符。
⑥ 元素名称不能以数字或者标点符号开始。
⑦ 元素名称中不能含空格。
三、解析XML技术
1. DOM
基于XML文档树结构的解析。
适用于多次访问的XML文档。
特点:比较消耗资源。
常用接口 | 常用方法 | 说明 |
---|---|---|
Document:表示整个 XML 文档 | NodeList getElementsByTagName(String Tag) | 按文档顺序返回文档中指定标记名称的所有元素集合 |
Element createElement(String tagName) | 创建指定标记名称的元素 | |
Node:该文档树中的单个节点 | NodeList getChildNodes() | 获取该元素的所有子节点,返回节点集合 |
Element:XML 文档中的一个元素 | String getTagName() | 获取元素名称 |
public class XmlUtils {
private Document document;
public XmlUtils(String url) {
getDocument(url);
}
public Document getDocument() {
return document;
}
// 声明方法获得Document对象的
private void getDocument(String url) {
// 获取解析器工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 从DOM工厂获得DOM解析器
try {
DocumentBuilder db = dbf.newDocumentBuilder();
// 解析XML文档,得到一个Document对象,即DOM树
this.document = db.parse(url);
} catch (ParserConfigurationException | IOException | SAXException e) {
e.printStackTrace();
}
}
// 声明保存XML的方法
// url: .xml文件相对地址
// character: 字符编码
private void saveXml(String url, String character){
//保存XML文件
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer;
try {
transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
//设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING, character);
StreamResult result = new StreamResult(new FileOutputStream(url));
//把DOM转换为XML文件
transformer.transform(domSource, result);
} catch (FileNotFoundException | TransformerException e) {
e.printStackTrace();
}
}
// 查询输出XML文件中的信息
public void showXmlInfo(String tagParentName, String parentName, String childName) {
NodeList parentNodes = document.getElementsByTagName(tagParentName);
for (int i = 0; i < parentNodes.getLength(); i++) {
// 将节点集合中的元素取出来
Node node = parentNodes.item(i);
Element parent = (Element) node;
String parentValue = parent.getAttribute(parentName);
System.out.println(parentValue);
NodeList childNodes = parent.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node childNode = childNodes.item(j);
if (childNode.getNodeType() == Node.ELEMENT_NODE) {
Element child = (Element) childNode;
String childValue = child.getAttribute(childName);
System.out.println("\t" + childValue);
}
}
}
}
// 声明向XML文件中添加数据的方法
public void addXml(String tagParentName, String parentName, String parentValue,
String tagChildName, String childName, String childValue,
String tagGrandName, String url, String character) {
// 创建parent节点
Element parentElement = document.createElement(tagParentName);
parentElement.setAttribute(parentName, parentValue);
// 创建child节点
Element childElement = document.createElement(tagChildName);
childElement.setAttribute(childName, childValue);
// 添加父子关系
parentElement.appendChild(childElement);
Element grandElement = (Element) document.getElementsByTagName(tagGrandName).item(0);
grandElement.appendChild(parentElement);
// 添加完毕后,保存xml文件
saveXml(url, character);
}
// 修改XML里面的数据
public void updateXml(String tagParentName, String childName, String oldValue, String newValue,String url, String character) {
// 找到修改的节点
NodeList nodeList = document.getElementsByTagName(tagParentName);
for (int i = 0; i < nodeList.getLength(); i++) {
Element parentElement = (Element) nodeList.item(i);
String childValue = parentElement.getAttribute(childName);
if (childValue.equals(oldValue)) {
parentElement.setAttribute(childName, newValue);
}
}
// 修改完毕后,保存xml文件
saveXml(url, character);
}
// 删除xml文件中的数据
public void deleteXml(String tagParentName, String childName, String delValue, String url, String character) {
// 找到删除的节点
NodeList nodeList = document.getElementsByTagName(tagParentName);
for (int i = 0; i < nodeList.getLength(); i++) {
Element parentElement = (Element) nodeList.item(i);
String childValue = parentElement.getAttribute(childName);
if (childValue.equals(delValue)) {
parentElement.getParentNode().removeChild(parentElement);
}
}
// 删除完毕后,保存xml文件
saveXml(url, character);
}
// xml文件相对路径
String url = "src/com/spark/xmlUtils/收藏信息.xml";
// 创建XmlUtils类
XmlUtils xmlUtils = new XmlUtils(url);
// 添加
// xmlUtils.addXml("Brand","name","MOTO","Type","name","A1680","PhoneInfo",url,"UTF-8");
// 修改
// xmlUtils.updateXml("Brand","name","MOTO","摩托罗拉",url,"UTF-8");
// 删除
// xmlUtils.deleteXml("Brand","name","MOTO",url,"UTF-8");
xmlUtils.showXmlInfo("Brand","name","name");
}
2. dom4j
非常优秀的Java XML API。
性能优异、功能强大。
开放源代码。
下载官网:https://dom4j.github.io/#parsing
DOM4j-中文API:https://www.bbsmax.com/A/pRdB6977dn/
public class Dom4j {
public Document document;
public String url = "src/com/spark/xmlUtils/收藏信息.xml";
public static void main(String[] args) {
}
public void loadDocument() {
SAXReader saxReader = new SAXReader();
try {
document = saxReader.read(new File(url));
} catch (DocumentException e) {
e.printStackTrace();
}
}
public void saveXML(String path) {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");// 指定XML编码
try {
XMLWriter writer = new XMLWriter(new FileWriter(path), format);
writer.write(document);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void showPhoneInfo() {
// 获取XML的根节点
Element root = document.getRootElement();
// 遍历所有的Brand标签
for (Iterator itBrand = root.elementIterator(); itBrand.hasNext(); ) {
Element brand = (Element) itBrand.next();
// 输出标签的name属性
System.out.println("品牌:" + brand.attributeValue("name"));
// 遍历Type标签
for (Iterator itType = brand.elementIterator(); itType.hasNext(); ) {
Element type = (Element) itType.next();
// 输出标签的name属性
System.out.println("\t型号:" + type.attributeValue("name"));
}
}
}
public void addNewPhoneInfo() {
// 获取XML的根节点
Element root = document.getRootElement();
// 创建Brand标签
Element element = root.addElement("Brand");
// 给Brand标签设置属性
element.addAttribute("name", "三星");
// 创建Type标签
Element typeElement = element.addElement("Type");
// 给Type标签设置属性
typeElement.addAttribute("name", "Note4");
saveXML(url);
}
public void updatePhoneInfo() {
// 获取XML的根节点
Element root = document.getRootElement();
int id = 0;
for (Iterator itBrand = root.elementIterator(); itBrand.hasNext(); ) {
Element brand = (Element) itBrand.next();
if (brand.attributeValue("name").equals("华为")) {
brand.getParent().remove(brand);
}
}
saveXML(url);
}
public void deleteItem() {
// 获取XML的根节点
Element root = document.getRootElement();
int id = 0;
for (Iterator itBrand = root.elementIterator(); itBrand.hasNext(); ) {
Element brand = (Element) itBrand.next();
if (brand.attributeValue("name").equals("华为")) {
brand.getParent().remove(brand);
}
}
saveXML(url);
}
public static void main(String[] args) {
loadDocument();
// showPhoneInfo();
addNewPhoneInfo();
// saveXML("新收藏.xml");
// updatePhoneInfo();
// deleteItem();
showPhoneInfo();
}
}