XML文档
1.可扩展的标记语言
2.XML文档基本结构
(1)XML声明(一般放在文档第一句)
<?xml version="1.0" encoding="utf-8"?>(2)每个XML文档都有且只有一个元素
(3)每个元素如果成对出现,要一起敲出来
(4)个元素之间如果有层级关系注意缩进
(5)xml注释
3.元素
<student id=“1”,name=“liling”>李玲
转义符
-
命名空间
xmlns:****=“URI”
元素或者属性 命名空间
xmlns:
6.解析XML技术
DOM解析
DOM常见接口
)
访问DOM树节点
Phone.xml
<?xml version="1.0" encoding="UTF-8"?>
<Phone>
<brand name="华为">
<Type name="U8650"/>
//元素节点
<Type name="HW123"/>
<Type name="HW321"/>
</brand>
<brand name="苹果">
<Type name="苹果13"/>
<Type name="苹果14"/>
<Type name="苹果15"/>
</brand>
</Phone>
package XML;
import com.sun.xml.internal.ws.api.server.SDDocumentSource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
public class XML {
Document document;
//获得Dom树
public void getNode() {
// 解析XML文件
//创建解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try { // 解析器工厂创建解析对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析器对象指定XML文件创建Document对象
document = builder.parse("Phone.xml");
} catch (Exception e) {
e.printStackTrace();
}
}
public void showInfo () {
// 以Document对象为起始点操作DOM树
NodeList nodeList = document.getElementsByTagName("brand");
//遍历NodeList,取出个节点
for (int i = 0; i < nodeList.getLength(); i++) {
//每一个nodeList节点
Node node = nodeList.item(i);
Element element = (Element) node;
String name = element.getAttribute("name");
System.out.println(name);
//继续找node下面的节点<type>
NodeList nodeList1 = element.getChildNodes();
for (int j = 0; j < nodeList1.getLength(); j++) {
Node node1 = nodeList1.item(j);
//判断节点是否为元素
if (node1.getNodeType() == Node.ELEMENT_NODE) {
Element element1 = (Element) node1;
String type = element1.getAttribute("name");
System.out.println("\t" + type);
}
}
}
}
//保存XML文件
public void SaveXML (String path) {
//获得转换器
TransformerFactory factory = TransformerFactory.newInstance();
factory.setAttribute("indent-number",4);
try {
Transformer transformer = factory.newTransformer();
//指定特定的转换格式
transformer.setOutputProperty(OutputKeys.ENCODING/*设置输出属性*/,"UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT,"yes");
//源
DOMSource source=new DOMSource(document);
//目标
//StreamResult result=new StreamResult(new FileOutputStream(path));
StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path),"UTF-8"));
//转换
transformer.transform(source,result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
//添加XML
public void add(){
//(1)创建Brand元素
Element brand=document.createElement("brand");
//(2)设置Brand元素的name=“三星”
brand.setAttribute("name","三星");
//(3)创建Type元素
Element type=document.createElement("Type");
//(4)设置Type元素
type.setAttribute("type","note7");
//(5)Type加到Brand里面去
brand.appendChild(type);
//(6)再把Brand加到<Phone>里面
document.getElementsByTagName("Phone").item(0).appendChild(brand);
}
//修改元素为<brand>添加属性
public void updataEle(){
//获得每一个Brand元素
NodeList brand=document.getElementsByTagName("brand");
for (int i=0;i<brand.getLength();i++){
Node node=brand.item(i);
Element brandEle=(Element)node;
//修改每个Brand元素属性id
brandEle.setAttribute("id",i+"");
}
SaveXML("新Phone。xml");
}
//删除元素
public void deleEle(){
//遍历每一个Brand元素
NodeList brand=document.getElementsByTagName("brand");
for (int i=0;i<brand.getLength();i++){
Node node=brand.item(i);
Element brandEle=(Element)node;
if (brandEle.getAttribute("name").equals("华为")){
brandEle.getParentNode().removeChild(brandEle);
}
}
SaveXML("新Phone。xml");
}
public static void main (String[]args){
XML xml = new XML();
xml.getNode();
//xml.showInfo();
xml.add();
xml.updataEle();
xml.deleEle();
xml.SaveXML("新Phone.xml");
}
}
Dom4j.jar包
package XML;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
public class Dom4jXML {
public Document doc;
//获得DOM树
public void loadDocument(){
SAXReader saxReader=new SAXReader();
try {
doc=saxReader.read(new File("Phone.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
}
public void shouInfo(){
//获取XML根节点
Element root=doc.getRootElement();
//遍历所有的Brand标签
for (Iterator itBrand=root.elementIterator();itBrand.hasNext();){
Element brand=(Element)itBrand.next();
//输出标签的name属性
System.out.println(brand.attributeValue("name"));
for (Iterator ittype=brand.elementIterator();ittype.hasNext();){
Element type=(Element)ittype.next();
//输出标签的name属性
System.out.println(type.attributeValue("name"));
}
}
}
//保存XML文件
public void saveXML(String path){
try {OutputFormat format=OutputFormat.createCompactFormat();
format.setEncoding("UTF-8");//指定XML编码
XMLWriter writer;
writer=new XMLWriter(new FileWriter(path),format);
writer.write(doc);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//添加元素
public void add(){
//获取XML根节点
Element root=doc.getRootElement();
//创建Brand标签
Element el =root.addElement("brand");
//添加brasn标签属性
el.addAttribute("name","三星");
//创建type标签
Element e2=root.addElement("type");
//添加type标签属性
e2.addAttribute("name","note7");
saveXML("Dom4jPhone.xml");
}
//修改
public void updatePhone(){
//获取XML根节点
Element root=doc.getRootElement();
int id=0;
for (Iterator iterator=root.elementIterator();iterator.hasNext();){
Element element=(Element)iterator.next();
id++;
element.addAttribute("id",id+"");
}
}
//删除
public void dele(){
//获取XML根节点
Element root=doc.getRootElement();
int id=0;
for (Iterator iterator=root.elementIterator();iterator.hasNext();) {
Element element = (Element) iterator.next();
if (element.attributeValue("name").equals("华为")){
element.getParent().remove(element);
}
}
saveXML("Dom4jPhone.xml");
}
public static void main(String[] args) {
Dom4jXML dom4jXML=new Dom4jXML();
dom4jXML.loadDocument();
dom4jXML.shouInfo();
dom4jXML.add();
dom4jXML.dele();
}
}
nt().remove(element);
}
}
saveXML("Dom4jPhone.xml");
}
public static void main(String[] args) {
Dom4jXML dom4jXML=new Dom4jXML();
dom4jXML.loadDocument();
dom4jXML.shouInfo();
dom4jXML.add();
dom4jXML.dele();
}
}