注意:学习下面内容需要参考那个文档w3cschool(学习Java资源),Gitee上传!
1 Xml格式:
<?xml version="1.0" encoding="UTF-8"?> <!-- 这 是 注 释 --> <Students> <student> <name>zhangsan</name> <age>18</age> <gender>男</gender> </student> <student name="张三" gender='男' age="18" /> </Students>
<?xml version="1.0" encoding="UTF-8"?> <!-- 如果有一个包含标签体的标签, 他的标签体是一个普通文本,不是子标签, 而普通文本中包含了一个标签,那这样可以吗? 答:不可以,如果要实现这种效果 要加入<![CDATA[内容...]]> --> <students> <student> <name>zhangsan</name> <url> <![CDATA[ <itheima>www.itheima.com</itheima> <itcast>www.itcast.cn</itcast> ]]> </url> </student> <student> <name>zhangsan</name> <url> <itheima>www.itheima.com</itheima> </url> </student> </students>
2.DTD约束格式:
<?xml version="1.0" encoding="UTF-8" ?> <!-- 约束文档 --> <!ELEMENT 书架 (书+)> <!-- 约束根标签的 ,如果有一个XML文件引入dtd文档,根标签只能叫 书架 ,括号里给的是子标签,+号代表的是子标签的数量 ,+号是至少有一次,可以有多次 --> <!ELEMENT 书 (书名,作者,售价)> <!-- 子标签下面 还有三个子标签,由于用逗号分割,顺序不能乱,没有次数,只能有一次 --> <!ELEMENT 书名 (#PCDATA)> <!-- PCDATA 可以有标签体,标签体也可以是普通文本--> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 书架 SYSTEM "B_book.dtd"> <书架> <书> <书名>书名</书名> <作者>作业</作者> <售价>售价</售价> </书> </书架>
3 schema约束:
<?xml version='1.0' encoding='UTF-8' ?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='http://www.jinlingit.com'> <xs:element name='书架' > <xs:complexType> <xs:sequence maxOccurs='unbounded' > <xs:element name='书' > <xs:complexType> <xs:sequence> <xs:element name='书名' type='xs:string' /> <xs:element name='作者' type='xs:string' /> <xs:element name='售价' type='xs:string' /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
<?xml version="1.0" encoding="UTF-8"?> <书架> xmlns:jinling="http://www.jinlingit.com" xmlns:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:xsi:schemaLocation="http://www.jinlingit.com book.xsd"> <书> <书名></书名> <作者></作者> <售价></售价> </书> </书架>
4 解析XML文件(重点!!)
<?xml version="1.0" encoding="UTF-8"?> <State Code="37" Name="河南" description="郑州" GDP="99999亿"> <City> <Name>郑州</Name> <Region>高新区</Region> </City> <City>三门峡</City> <City>洛阳</City> <City>信阳</City> <City>南阳</City> <City>南阳1</City> <ity>南阳啊啊</ity> </State>
以下是Dom方式解析:(sax暂时不掌握)
package day49_day50; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; /* * Dom4J的常用方法: * Document: * Element getRootElement() :获取根元素对象(根标签) * Element: * List elements() :获取所有的子元素 * List elements(String name) :根据指定的元素名称来获取相应的所有的子元素 * Element element(String name) :根据指定的元素名称来获取子元素对象 * String elementText(String name) :根据指定的元素名称,来获取子元素中的文本 * String getText() :获取当前元素对象的文本 * void setData(Object data):设置当前元素对象 * String attributeValue(String name) : 根据指定的属性名称获取其对应的值 * * * * */ public class C_Dom4jDemo { public static void main(String[] args) throws Exception { //1.根据子元素的名称(属性)来获取子元素的文本 // method1(); //2.得到子标签的内容,如果标签内套有标签,那么是输出空内容 // method2(); // 3,修改某一个元素节点的主体内容:信阳----安阳 // method3(); // 4,向指定元素节点中增加子元素节点: 增加一个新城市 : <City>南阳</City> 这个会加在最后的位置 // method5(); // 5,向指定元素节点上增加同级元素节点:在洛阳前面,增加一个<City>三门峡</Cicy> // method6(); // 6,删除指定元素节点: 删除元素开封 // method4(); // 7,操作XML文件属性 打印State的Name method7(); // 8,增加属性 : State: GPD:="99999亿" method8(); } private static void method2() throws Exception { // 遍历所有的元素节点,打印他们的元素名称。 // 先获取根元素 Document document = C_Dom4JUtils.getDocument(); Element rootElement = document.getRootElement(); List<Element> elements = rootElement.elements(); // 得到子标签的内容,如果标签内套有标签,那么是输出空内容! for (Element element : elements) { System.out.println(element.getText()); } } private static void method1() throws Exception { // 得到某个具体的节点内容: 打印郑州 Document document = C_Dom4JUtils.getDocument(); // 获取根元素state Element rootElement = document.getRootElement(); // 获取根元素下的所有子元素 city... List<Element> elements = rootElement.elements(); // 根据索引获取第一个city元素(就是有郑州、高新区那个city) Element cityElement = elements.get(0); // 根据子元素的名称(属性)来获取子元素的文本 String text = cityElement.elementText("Region"); System.out.println(text); } // 扩展 private static void method3() throws Exception, IOException { // 3、修改某个元素节点的主体内容:信阳-->安阳 Document document = C_Dom4JUtils.getDocument(); // 获取根元素 Element rootElement = document.getRootElement(); // 获取根元素下的所有子元素 List<Element> es = rootElement.elements(); // 根据索引可以获取指定的元素 Element cityElement = es.get(3); // 修改文本 cityElement.setText("安阳"); // 写回文件 C_Dom4JUtils.write2XML(document); } private static void method4() throws Exception, IOException { // 6、删除指定元素节点:删除元素开封,在索引2的位置 Document document = C_Dom4JUtils.getDocument(); // 获取根元素 Element rootElement = document.getRootElement(); // 获取根元素下的所有子元素 List<Element> es = rootElement.elements(); Element cityElement = es.get(2); // 无法自杀,找他爹 Element parentElement = cityElement.getParent(); parentElement.remove(cityElement); // 写回文件 C_Dom4JUtils.write2XML(document); } private static void method5() throws Exception, IOException { // 4、向指定元素节点中增加子元素节:添加一个新城市<City>南阳</City> Document document = C_Dom4JUtils.getDocument(); // 获取根元素 Element rootElement = document.getRootElement(); // 添加元素 Element cityElement = rootElement.addElement("ity");// 设置标签 // 设置文本 cityElement.setText("南阳啊啊"); // 写回文件 C_Dom4JUtils.write2XML(document); } private static void method6() throws Exception, IOException { // 5、向指定元素节点上增加同级元素节点:在洛阳前面,添加一个<City>三门峡</City> // 创建一个新的元素对象 Element cityElement = DocumentHelper.createElement("City"); // 设置文本 cityElement.setText("三门峡"); Document document = C_Dom4JUtils.getDocument(); // 获取根元素 Element rootElement = document.getRootElement(); // 获取根元素下所有的子元素 List<Element> es = rootElement.elements(); // 将新的元素添加到子元素列表中 es.add(1, cityElement);//这个1 是索引位置,将1索引位置取代了,所以加在了2索引的上一个标签位置了 // 写会文件 C_Dom4JUtils.write2XML(document); } private static void method7() throws Exception { // 7、操作XML文件属性:打印State的Name Document document = C_Dom4JUtils.getDocument(); // 获取根元素 Element rootElement = document.getRootElement(); // 获取根元素下所有的子元素 List<Element> es = rootElement.elements(); // 根据属性名称获取值 String value = rootElement.attributeValue("Name"); System.out.println(value); } private static void method8() throws Exception { // 7、操作XML文件属性:打印State的Name // 8、添加属性:State: GDP="99999亿" Document document = C_Dom4JUtils.getDocument(); // 获取根元素 Element rootElement = document.getRootElement(); // 添加新的属性和对应的值 rootElement.addAttribute("GDP", "99999亿"); // 写回文件 C_Dom4JUtils.write2XML(document); } }
package day49_day50; import java.io.FileOutputStream; import java.io.IOException; import org.dom4j.Document; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class C_Dom4JUtils { private C_Dom4JUtils(){} public static Document getDocument() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/day49_day50/city.xml"); return document; } public static void write2XML(Document document) throws IOException { OutputFormat format = OutputFormat.createPrettyPrint(); //format.setEncoding("UTF-8");//默认的编码就是UTF-8 XMLWriter writer = new XMLWriter( new FileOutputStream("src/day49_day50/city.xml"), format ); writer.write( document ); } }