文档出现乱码怎么回事?(文档为什么突然乱码了)
687
2022-05-29
本章只讲DOM解析。接下来还会学习Dom4j和StAX 解析技术
DOM解析:
DOM解析一次将所有的元素全部加载到内存中:如有以下XML文档:
1
2
3
4
由于DOM解析,一次性的将所有元素(包含属性和文本) 全部加载到内存中,所以不适用于解析大量的数据。
JAXP-DOM解析:
包:
javax.xml.parse – 关键类DocumentBuilder,文档解析对像。
org.w3c.dom – 关键类Document代表内存中的文档对像模型。
java.xml – 关键类Transformer,用于将内存中的文档保存到文件中。
users.xml:-在xml4文件夹下面
1
2
3
4
5
6
7
8
9
10
11
12
代码演示:
package cn.hncu.dom; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.junit.Test; 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; /** * @author 陈浩翔 2016-6-29 */ public class DomDemo1 { @Test // 需求:把第一个user节点的name的值取出来 public void getDom() throws SAXException, IOException, ParserConfigurationException { // 第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbf对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 第二步,通过dbf对象创建出一个DocumentBuilder对象 DocumentBuilder db = dbf.newDocumentBuilder(); // 第三步,通过db对象创建出一个Document对象 Document dom = db.parse("xml4/users.xml"); // db.parse( new File("xml4/users.xml") );//也可以 System.out.println(dom);// [#document: null] Node root = dom.getFirstChild();// 这个是根节点 System.out.println("root:" + root);// root:[users: null] System.out.println(root.getNodeName());// users System.out.println(root.getFirstChild().getNodeName());// #text // 上面一句的输出是:#text ----dom中把空白符也看成是一个Node,这种情况对我们的解析通常会造成很大的麻烦 // ※※为解决上面的问题,我们以后解析时尽量不要用Node,而要用Element。 // 因为Element是元素它不包含属性和文字内容(包括空白符),因此可避开空白符的干扰 Element eRoot = (Element) root; NodeList list = eRoot.getElementsByTagName("user"); System.out.println("user元素的数量:" + list.getLength()); System.out.println("第2个user元素" + list.item(1)); Node user1Node = list.item(0); Element eUser1 = (Element) user1Node;// 要把Node强转成Element,因为Element是子接口,里面有getElementBy*等方法,而Node没有(只能采用childNodes的方式,这种方式会受空白符的干扰) NodeList listNames = eUser1.getElementsByTagName("name"); String nm = listNames.item(0).getNodeName();// name--标签名 String nmVal = listNames.item(0).getTextContent();// 标签内部所包含的文本内容----相当于JavaScript中的innerText System.out.println(nm + "," + nmVal); } @Test //需求:把第二个user节点的age值取出来 public void getAge()throws Exception{ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document dom = db.parse(new File("xml4/users.xml")); Element root = (Element)dom.getFirstChild(); Element user2 = (Element)root.getElementsByTagName("user").item(1); Element eAge = (Element)user2.getElementsByTagName("age").item(0); String age = eAge.getTextContent(); System.out.println("age:"+age); } //用java对xml文档进行CRUD---创建,遍历,更新,删除 //创建---需求:添加一个新的user @Test public void create() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder db = factory.newDocumentBuilder(); Document dom = db.parse(new File("xml4/users.xml")); Element root = (Element) dom.getFirstChild(); //创建一个新的user元素 Element eUserNode = dom.createElement("user"); eUserNode.setAttribute("id", "C001");//给元素添加属性 //创建name和age子元素 Element eName = dom.createElement("name"); eName.setTextContent("李四");//设置name标签容器中包含的文字 Element eAgeNode = dom.createElement("age"); eAgeNode.setTextContent("33"); //把所创建的元素组装成一颗子树,添加到整颗dom树上 eUserNode.appendChild(eName); eUserNode.appendChild(eAgeNode); root.appendChild(eUserNode); //再把当前内存中的dom对象存储进xml文件 TransformerFactory tf = TransformerFactory.newInstance(); Transformer trans = tf.newTransformer(); trans.transform(new DOMSource(dom), new StreamResult("xml4/users.xml")); } //遍历---查找 @Test public void query() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder db = factory.newDocumentBuilder(); Document dom = db.parse("xml4/users.xml"); Element root = (Element) dom.getFirstChild();//得到根节点 NodeList list = root.getElementsByTagName("user");//这个user是xml文档中的元素 for(int i=0;i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 小知识点: 注意:子类才可以当父类用。 父类的话,如果你确定那个类一定是这个父类的某个子类了,才可以强转为子类!!! Java XML
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。