XML(可扩展标记语言,Extensible Markup Language)是一种用于定义文档结构和数据存储的标记语言。它主要用于在不同的系统之间传输和存储数据。
作用:
特点
王珊
.NET高级编程
包含C#框架和网络编程等
李明明
XML基础编程
包含XML基础概念和基本作用
<元素名 属性名=“属性值”>元素内容元素名>
DOM:
SAX:
DOM4:
文档对象模型(Document Object Model),DOM把XML文档映射成一个倒挂的树
三国演义
罗贯中
30元
DOM解析XML文件步骤:
1.创建解析器工厂对象
2.解析器工厂对象创建解析器对象
3.解析器对象指定XML文件创建Document对象
4.以Document对象为起点操作DOM树
5.创建Transformer对象
作用->将内存中的document对象写入xml文件
1)TransformerFactory.newInstance() 获取TransformerFactory()对象
2)transformerFactory.newTransformer() 获取Transformer对象
3)transformer.transform() 将document写入xml文件
显示“收藏信息.xml”文件中收藏的手机品牌和型号
package practise.practise02;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class DomShowPhone {
public static void main(String[] args) {
try {
// 1. 创建一个 DocumentBuilderFactory 实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2. 使用工厂方法创建一个 DocumentBuilder 实例
DocumentBuilder builder = factory.newDocumentBuilder();
// 3. 解析 XML 文件并获取 DOM Document 对象
Document document = builder.parse("Test10/config/phone.xml");
// 4. 规范化 XML 文档
document.getDocumentElement().normalize();//除去多余的换行符和空格,使树形结构更加完整
// 5. 获取根元素
// Element root = document.getDocumentElement();//获取根元素
// System.out.println("根元素为: " + root.getNodeName());//获取根元素名字
// 6. 获取所有 元素
NodeList nList = document.getElementsByTagName("Brand");//按照文档顺序将所有Brand元素返回到集合中
for (int temp = 0; temp < nList.getLength(); temp++) {
Node node = nList.item(temp);//遍历获取Brand节点
Element eElement= (Element) node;
System.out.println("品牌:"+eElement.getAttribute("name"));//得到name属性的值
NodeList type = eElement.getElementsByTagName("Type");
for (int i = 0; i < type.getLength(); i++) {
Element type1 = (Element) type.item(i);
type1.setAttribute("id","type"+(i+1));
System.out.println("型号:"+type1.getAttribute("name"));//获取name属性的值 Attribute属性的意思
}
// if (node.getNodeType() == Node.ELEMENT_NODE) {//用于确保当前节点是一个元素节点(ELEMENT_NODE)。
// Element eElement = (Element) node;
//
// // 打印书籍的详细信息
// System.out.println("Title: " + eElement.getElementsByTagName("title").item(0).getTextContent());//获取元素的文本内容
// System.out.println("Author: " + eElement.getElementsByTagName("author").item(0).getTextContent());
// System.out.println("Price: " + eElement.getElementsByTagName("price").item(0).getTextContent());
// }
}
Node brand = nList.item(0);
Element brand1 = (Element) brand;
brand1.setAttribute("id","brand1");
// brand1.setAttribute("id","b1");
} catch (Exception e) {
e.printStackTrace();
}
}
}
package practise.practise03;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
public class AddBrandDOM {
public static void main(String[] args) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("Test10/config/phone.xml");
Element newBrand = document.createElement("Brand");
newBrand.setAttribute("name","三星");
Element newType = document.createElement("Type");// tag 是标签的意思
newType.setAttribute("name","Note4");
newBrand.appendChild(newType);//将newType元素添加到newBrand的子节点
Element root = document.getDocumentElement();//得到根节点
root.appendChild(newBrand);//将newBrand元素添加到根元素的子节点
// 6. 创建 Transformer 对象以保存修改后的 DOM 树
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 7. 设置输出属性
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
// 8. 创建 DOMSource 对象
DOMSource domSource = new DOMSource(document);
// 9. 创建 StreamResult 对象并指定输出文件
StreamResult streamResult = new StreamResult("Test10/config/phone.xml");
// 10. 保存修改后的 XML 到指定文件
transformer.transform(domSource, streamResult);
System.out.println("XML 文件已成功修改");
} catch (Exception e) {
e.printStackTrace();
}
}
}
修改/删除DOM节点:
删除Brand值为“华为”的标签
XML文件:
package practise.practise1;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.IOException;
public class RomeBrandDOM {
public static void main(String[] args) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("Test11/config/phone.xml");
Element root = document.getDocumentElement();//获取根节点元素
root.normalize();
NodeList nodeList = document.getElementsByTagName("Brand");
for (int i = 0; i < nodeList.getLength(); i++) {
document.getDocumentElement().normalize();
Node node=nodeList.item(i);
Element element = (Element) node;
element.setAttribute("id","brand"+(i+1));
if ("华为".equals(element.getAttribute("name"))){
element.getParentNode().removeChild(element);
i--;
}
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 7. 设置输出属性
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 启用缩进
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); // 设置缩进量(每级缩进4个空格)
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); // 设置编码
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); // 保留 XML 声明
transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
// 8. 创建 DOMSource 对象
DOMSource domSource = new DOMSource(document);
// 9. 创建 StreamResult 对象并指定输出文件
StreamResult streamResult = new StreamResult("Test11/config/phone.xml");
// 10. 保存修改后的 XML 到指定文件
transformer.transform(domSource, streamResult);
System.out.println("XML 文件已成功修改");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
SAXReader解析器:
SAXReader reader = new SAXReader();
String xmlString = ResourceUtil.readStr("conversion/TestMain.xml", StandardCharsets.UTF_8);
Document document = reader.read(new ByteArrayInputStream(xmlString.getBytes(StandardCharsets.UTF_8)));
package practise.practise2;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
@SuppressWarnings("all")
public class ShowDom4j {
public static void main(String[] args) {
String str="Test11/config/phone.xml";
SAXReader saxReader = new SAXReader();
try {
//1 显示手机收藏信息
Document document = saxReader.read(str);
Element rootElement = document.getRootElement();
List brandList = rootElement.elements("Brand");//取得子节点所有Brand元素
Iterator iterator = brandList.iterator();
while (iterator.hasNext()) {
Element brandElement = iterator.next();
System.out.print("Brand-id="+brandElement.attributeValue("id")+",Brand-name="+brandElement.attributeValue("name"));
List type = brandElement.elements("Type");
for (Element element :type) {
System.out.println("Type-name="+element.attributeValue("name"));
}
}
//2,3 为手机收藏信息并添加新节点并保存
Element priceElement = rootElement.addElement("price");
priceElement.addAttribute("id","brand3");
priceElement.addAttribute("name","小米");
Element typeElement = priceElement.addElement("Type");
typeElement.addAttribute("name","小米11");
//4 修改/删除手机收藏信息节点 删除苹果节点的子节点
Node node = document.selectSingleNode("//Brand[@name='苹果']");//xpath 语法
Element branElment=(Element) node;
rootElement.remove(branElment);
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8"); // 设置编码
format.setIndent(true); // 启用缩进
format.setIndentSize(4); // 设置缩进的空格数
format.setNewLineAfterDeclaration(true); // 在 XML 声明后添加换行
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(str),format);
xmlWriter.write(document);
System.out.println("写入成功xml!!");
xmlWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}