目录
使用的xml文件
整体代码
获得DOM树。
保存xml文件
xml文件显示到控制台
添加节点
修改节点属性
删除节点
主方法
使用的xml文件
<?xml version="1.0" encoding="GB2312" ?> <PhoneInfo> <Brand name="华为"> <Type name="P9"/> </Brand> <Brand name="苹果"> <Type name="iphone5"/> <Type name="iphone6"/> </Brand> </PhoneInfo>
0、整体代码
package test; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class XmlTest { Document doc = null;// 创建一个Document对象 public static void main(String[] args) { XmlTest xml = new XmlTest(); xml.getDocument(); xml.creatNode(); xml.changeType(); xml.showInfo(); xml.deleteNode("SAMSUNG"); xml.showInfo(); xml.saveXml("D:/xml.xml"); } /** * 获得DOM树 * */ public void getDocument() { // 1、得到DOM工厂解析器工厂实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { // 2、从DOM工厂中获得Dom解析器 DocumentBuilder db = factory.newDocumentBuilder(); // 3、解析XML文件获得Document对象,即DOM树 doc = db.parse("收藏信息.xml"); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 显示xml文档信息 ! */ public void showInfo() { // 获取DOM树Brand节点 NodeList BrandName = doc.getElementsByTagName("Brand"); for (int i = 0; i < BrandName.getLength(); i++) { // 获取第i个Brand元素的信息(返回i元素) Node brand = BrandName.item(i); // Element是Node的子类,用Element的getAttribute("属性名")获得元素属性 Element element = (Element) brand; // 获取第i个Brand元素的name属性 String brandAttribute = element.getAttribute("name"); // 获得所有的子节点 NodeList types = element.getChildNodes(); for (int j = 0; j < types.getLength(); j++) { Node type = types.item(j); // 判断是否是元素节点(使用getChildNodes()就要判断) if (type.getNodeType() == Node.ELEMENT_NODE) { Element typeEle = (Element) type; String typeAttribute = typeEle.getAttribute("name"); System.out.println("手机:" + brandAttribute + typeAttribute); } } } } /** * 新增节点 * */ public void creatNode() { // 创建三星节点 Element brandEle = doc.createElement("Brand"); brandEle.setAttribute("name", "三星"); // 创建型号Note7节点 Element type = doc.createElement("Type"); type.setAttribute("name", "Note7"); // 把note7元素挂到三星元素上 brandEle.appendChild(type); // 找到PhoneInfo节点 NodeList PhoneInfosNode = doc.getElementsByTagName("PhoneInfo"); for (int i = 0; i < PhoneInfosNode.getLength(); i++) { Node PhoneInfos = PhoneInfosNode.item(i); if (PhoneInfos.getNodeType() == Node.ELEMENT_NODE) { // 把三星节点挂到PhoneInfo上 PhoneInfos.appendChild(brandEle); } } } /** * 保存xml文档 * * @param path 保存的路径 */ public void saveXml(String path) { // 1、创建转换工厂 TransformerFactory factory = TransformerFactory.newInstance(); try { // 2、从工厂中获得转换器 Transformer Transformer = factory.newTransformer(); // 3、进行转换,如果直接转换可能出现乱码,需要进行格式设置 // 输出文件编码格式设置 Transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312"); // 需要DOM转换的源文件 DOMSource xmlSource = new DOMSource(doc); // 指定目标路径 StreamResult outputTarget = new StreamResult(new FileOutputStream( path)); // 使用transform()进行保存xml文件 Transformer.transform(xmlSource, outputTarget); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TransformerException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 更改Brand属性 * */ public void changeType(){ //获得节点信息 NodeList brandElements = doc.getElementsByTagName("Brand"); //遍历节点 for (int i = 0; i < brandElements.getLength(); i++) { Node brands = brandElements.item(i); Element brand=(Element) brands; String brandAtt = brand.getAttribute("name"); //判断节点属性值 if(brandAtt.equals("三星")){ brand.setAttribute("name", "SAMSUNG"); } } } /** * 删除指定节点 * @param name 删除的Brand属性名 */ public void deleteNode(String name){ NodeList brandsEle = doc.getElementsByTagName("Brand"); for (int i = 0; i < brandsEle.getLength(); i++) { Element brand = (Element) brandsEle.item(i); String brandAttribute = brand.getAttribute("name"); if(brandAttribute.equals(name)){ doc.getElementsByTagName("PhoneInfo").item(0).removeChild(brand); } } } }
1、通过DocumentBuilderFactory 获得解析工厂,在工厂中获得解析器实例,通过解析器获得DOM树。
/** * 获得DOM树 * */ public void getDocument() { // 1、得到DOM工厂解析器工厂实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { // 2、从DOM工厂中获得Dom解析器 DocumentBuilder db = factory.newDocumentBuilder(); // 3、解析XML文件获得Document对象,即DOM树 doc = db.parse("收藏信息.xml"); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
2、保存xml文件
/** * 保存xml文档 * * @param path 保存的路径 */ public void saveXml(String path) { // 1、创建转换工厂 TransformerFactory factory = TransformerFactory.newInstance(); try { // 2、从工厂中获得转换器 Transformer Transformer = factory.newTransformer(); // 3、进行转换,如果直接转换可能出现乱码,需要进行格式设置 // 输出文件编码格式设置 Transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312"); // 需要DOM转换的源文件 DOMSource xmlSource = new DOMSource(doc); // 指定目标路径 StreamResult outputTarget = new StreamResult(new FileOutputStream( path)); // 使用transform()进行保存xml文件 Transformer.transform(xmlSource, outputTarget); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TransformerException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
3、xml文件显示到控制台
/** * 显示xml文档信息 ! */ public void showInfo() { // 获取DOM树Brand节点 NodeList BrandName = doc.getElementsByTagName("Brand"); for (int i = 0; i < BrandName.getLength(); i++) { // 获取第i个Brand元素的信息(返回i元素) Node brand = BrandName.item(i); // Element是Node的子类,用Element的getAttribute("属性名")获得元素属性 Element element = (Element) brand; // 获取第i个Brand元素的name属性 String brandAttribute = element.getAttribute("name"); // 获得所有的子节点 NodeList types = element.getChildNodes(); for (int j = 0; j < types.getLength(); j++) { Node type = types.item(j); // 判断是否是元素节点(使用getChildNodes()就要判断) if (type.getNodeType() == Node.ELEMENT_NODE) { Element typeEle = (Element) type; String typeAttribute = typeEle.getAttribute("name"); System.out.println("手机:" + brandAttribute + typeAttribute); } } } }
4、添加节点Brand:三星,Type:note7
/** * 新增节点 * */ public void creatNode() { // 创建三星节点 Element brandEle = doc.createElement("Brand"); brandEle.setAttribute("name", "三星"); // 创建型号Note7节点 Element type = doc.createElement("Type"); type.setAttribute("name", "Note7"); // 把note7元素挂到三星元素上 brandEle.appendChild(type); // 找到PhoneInfo节点 NodeList PhoneInfosNode = doc.getElementsByTagName("PhoneInfo"); for (int i = 0; i < PhoneInfosNode.getLength(); i++) { Node PhoneInfos = PhoneInfosNode.item(i); if (PhoneInfos.getNodeType() == Node.ELEMENT_NODE) { // 把三星节点挂到PhoneInfo上 PhoneInfos.appendChild(brandEle); } } }
5、修改节点属性,修改"三星"为"SAMSUNG"
/** * 更改Brand属性 * */ public void changeType(){ //获得节点信息 NodeList brandElements = doc.getElementsByTagName("Brand"); //遍历节点 for (int i = 0; i < brandElements.getLength(); i++) { Node brands = brandElements.item(i); Element brand=(Element) brands; String brandAtt = brand.getAttribute("name"); //判断节点属性值 if(brandAtt.equals("三星")){ brand.setAttribute("name", "SAMSUNG"); } } }
6、删除SAMSUNG节点
/** * 删除指定节点 * @param name 删除的Brand属性名 */ public void deleteNode(String name){ NodeList brandsEle = doc.getElementsByTagName("Brand"); for (int i = 0; i < brandsEle.getLength(); i++) { Element brand = (Element) brandsEle.item(i); String brandAttribute = brand.getAttribute("name"); if(brandAttribute.equals(name)){ doc.getElementsByTagName("PhoneInfo").item(0).removeChild(brand); } } }
7、主方法
public static void main(String[] args) { XmlTest xml = new XmlTest(); xml.getDocument(); xml.creatNode(); xml.changeType(); xml.showInfo(); xml.deleteNode("SAMSUNG"); xml.showInfo(); xml.saveXml("D:/xml.xml"); }