1、创建一个xml文件
<?xml version="1.0" encoding="UTF-8"?> <!-- xml:是一个可扩展的标记语言 01.很像超文本标记语言(html) 02.xml文件着重保存或者传输数据,不专注显示 03.无需预编译 04.符合w3c标准 < : < > : > " : " ' : ' & : & <![CDATA[代码]]> CDATA: character data 字符数据 不会被解析器解析的文本!在CDATA标签中定义的代码 不会被当作标记! PCDATA: parsed character data 被解析的字符数据 --> <students> <student id="001" name="小黑黑" score=">80">我是小黑黑</student> <student id="002" name="大黑黑" score="<80">我是大黑黑</student> </students> <![CDATA[ "" ;; '' <><>< ]]>
第一个xml文件
2、创建一个dtd文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE school[ //声明这是一个 school类型的文档 <!ELEMENT school(teacher)> //根节点是 school 下面只能有teacher <!ELEMENT teacher(student+)> //teacher可以有至少一个student节点 <!ELEMENT teacher(student*)> //teacher可以有多个,也可以没有 <!ELEMENT teacher(student?)> //teacher可以有1个,也可以没有 <!ATTLIST teacher //定义teacher节点中可以有的属性 ID CDATA #REQUIRED // #REQUIRED 属性值是 必须的 #IMPLIED 属性值不是必须的 EMPTY 空的 name CDATA "false"> ]>
3、创建一个xml文件引入dtd文件
<?xml version="1.0" encoding="UTF-8"?> <!-- 引入外部的dtd文档 --> <!DOCTYPE school SYSTEM"my.dtd">
=====================DOM解析xml文件=================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <PhoneInfo> <Brand id="1" name="华为"> <Type name="U8650"/> <Type name="HW123"/> <Type name="HW321"/> </Brand> <Brand id="2" name="苹果"> <Type name="iPhone4"/> <Type name="iPhone8"/> </Brand> <Brand id="3" name="诺基亚"> <Type name="N95"/> </Brand> <Brand id="4" name="诺基亚"> <Type name="N95"/> </Brand> </PhoneInfo>
4、DOM树解析----------------------------------------------------
public class DomTest { // 使用DOM (Document Object Model)解析xml 文件 // 因为所有的方法都需Dom树 static Document document = null; public static void main(String[] args) { showPhone(); // 显示所有的手机信息 addPhone(); updatePhone(); deletePhone(); System.out.println("************************"); showPhone(); // 显示所有的手机信息 } /** * 显示所有的手机信息 */ public static void showPhone() { DocumentBuilderFactory factory = null; DocumentBuilder builder = null; try { // 01.创建解析器工厂 factory = DocumentBuilderFactory.newInstance(); // 02.创建解析器对象 builder = factory.newDocumentBuilder(); // 03.解析指定的xml文件 document = builder.parse("收藏信息.xml"); /** * 04.获取手机的节点 NodeList接口中 只有 两个方法 * item(int index) 根据下标 获取 Node * getLength() 获取集合大小 */ NodeList list = document.getElementsByTagName("Brand"); System.out.println("集合的大小:" + list.getLength()); for (int i = 0; i < list.getLength(); i++) { Node node = list.item(i); // 没有获取属性的方法 Element接口实现 Node接口 Element element = (Element) node; System.out.println(element.getAttribute("name")); // 获取子节点 NodeList cList = element.getChildNodes(); for (int j = 0; j < cList.getLength(); j++) { Node cNode = cList.item(j); // 判断cNode是不是一个元素节点 if (cNode.getNodeType() == Node.ELEMENT_NODE) { Element cElement = (Element) cNode; System.out.println(cElement.getAttribute("name")); } } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 新增手机信息 */ public static void addPhone() { // 在dom树上新增节点 <Brand></Brand> Element element = document.createElement("Brand"); // 增加属性 <Brand name="诺基亚"></Brand> element.setAttribute("name", "诺基亚"); // 再创建一个节点 相当于 诺基亚的子节点 Element elementType = document.createElement("Type"); /** * <Brand name="诺基亚"> </Brand> * <Type name="N95"></Type> * 把Type节点放入Brand节点中 */ elementType.setAttribute("name", "N95"); /** * 给节点增加子节点 * <Brand name="诺基亚"> * <Type name="N95"/> * </Brand> * 还是没有放入根节点 PhoneInfo */ element.appendChild(elementType); /** * 获取根节点PhoneInfo 把 element整体放入PhoneInfo */ document.getElementsByTagName("PhoneInfo").item(0).appendChild(element); // 上面的操作都在在内存中创建的对象 并没有真正的 保存到xml文件 savePhone("收藏信息.xml"); } /** * 保存xml信息 */ private static void savePhone(String path) { TransformerFactory factory = null; Transformer fomer = null; try { // 创建转换器工厂 factory = TransformerFactory.newInstance(); // 生成转换器 fomer = factory.newTransformer(); fomer.setOutputProperty("indent", "yes"); // 创建一个输出流 从内存中 写入 电脑的指定文件中 StreamResult result = new StreamResult(new OutputStreamWriter( new FileOutputStream("收藏信息.xml"), "utf-8")); // 对整个DOM树进行解析 DOMSource source = new DOMSource(document); // 转换 保存 fomer.transform(source, result); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerFactoryConfigurationError e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } } /** * 修改手机信息 * 给所有的Brand节点 增加ID属性 */ public static void updatePhone() { NodeList nodeList = document.getElementsByTagName("Brand"); // 循环新增节点 for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); // 转换成元素 获取方法 Element element = (Element) node; element.setAttribute("id", i + 1 + ""); } savePhone("收藏信息.xml"); } /** * 删除指定的手机 * 删除id为4的 */ public static void deletePhone() { NodeList nodeList = document.getElementsByTagName("Brand"); // 循环新增节点 for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); // 转换成元素 获取方法 Element element = (Element) node; if (element.getAttribute("id").equals("4")) { // 找到id=4 // 从父节点 删除这个节点 element.getParentNode().removeChild(element); } } savePhone("收藏信息.xml"); } }
5、Dom4j解析-----------------------------------------------------------------------------------------
public class Dom4jTest { // Dom4j解析xml // 因为所有的方法都需要Dom树 static Document document = null; static Element root = null; public static void main(String[] args) { // 获取dom树 getDocument(); // addPhone(); deletePhone(); updatePhone(); showPhone(); } // 解析xml文件 public static void getDocument() { SAXReader reader = new SAXReader(); try { document = reader.read("收藏信息.xml"); root = document.getRootElement();// 获取根节点 } catch (DocumentException e) { e.printStackTrace(); } } /** * 显示所有的手机信息 */ public static void showPhone() { // 遍历所有的节点 Iterator itBrand = root.elementIterator(); while (itBrand.hasNext()) { Element brand = (Element) itBrand.next(); System.out.println("手机的品牌是:" + brand.attributeValue("name")); System.out.println("手机的编号是:" + brand.attributeValue("id")); System.out.println("===========下面是子节点============"); Iterator itType = brand.elementIterator(); while (itType.hasNext()) {// 获取手机型号 Element type = (Element) itType.next(); System.out.println("手机的型号是:" + type.attributeValue("name")); // 输出文本节点的值 if (!type.getText().equals("")) { System.out.println(type.getTextTrim()); } } } } // 保存xml信息 public static void save(String path) { OutputFormat format = null; XMLWriter writer = null; try { // dom4j的转换器 不用使用 new createPrettyPrint底层有 new format = OutputFormat.createPrettyPrint(); // 写入xml文件 writer = new XMLWriter(new FileWriter(path), format); writer.write(document); } catch (IOException e) { e.printStackTrace(); } finally { // 关流 try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } // 新增节点 public static void addPhone() { Element element = root.addElement("Brand"); // 节点设置属性 element.addAttribute("name", "黑莓"); // 节点下面新增子节点 Element type = element.addElement("Type"); type.addAttribute("name", "A1"); // 保存 省略 我们 节点之间的拼接! dom需要拼接 save("收藏信息.xml"); } // 删除 public static void deletePhone() { // 获取所有Brand Iterator brand = root.elementIterator(); while (brand.hasNext()) { Element element = (Element) brand.next(); // 拿到每一个Brand // 获取属性值 判断是不是 要删除的对象 if (element.attributeValue("name").equals("黑莓")) { element.getParent().remove(element); } } save("收藏信息.xml"); } // 修改 public static void updatePhone() { // 获取所有Brand Iterator brand = root.elementIterator(); while (brand.hasNext()) { Element element = (Element) brand.next(); // 拿到每一个Brand // 获取属性值 判断是不是 要修改的对象 if (element.attributeValue("name").equals("哇哈哈")) { element.attribute("name").setValue("哇哈哈哈哈"); } } save("收藏信息.xml"); } }