XML入门学习笔记之XML解析技术---DOM解析

来源:互联网 发布:周克华事件真相知乎 编辑:程序博客网 时间:2024/05/11 17:06

一.DOM解析

1.解析标准有w3c制定。

特点:

(1)dom会把xml文件看做一棵dom树并全部加在到内存。

(2)适合做crud操作。

(3)dom不太适合去操作比较大的xml文件(由于dom解析是将xml文件全部加在到内存中,而jvm在启动的时候默认最大内存64M,如果文件较大则内存溢出。解决办法:如果是myeclipse,可以右键工程-properties-Run/Debug Settings-Arguments-VM arguments 填写参数-Xmx?(?的值自定义。比如-Xmx200m则表示分配200m内存给jvm))

2.xml解析api  jaxp快速入门

首先写好一个文件class.xml

<span style="font-size:18px;color:#330000;"><?xml version="1.0" encoding="utf-8"?><root>   <stu num="st001">     <name>小丽</name>      <sex>女</sex>      <intro>这是一个好学生</intro>   </stu>    <stu num="sp004">     <name>小红</name>      <sex>女</sex>      <intro>这是一个好学生</intro>   </stu>      <stu num="sp005">    <name>黄晓明</name>    <sex>男</sex>    <intro>这不是一个好学生</intro>  </stu></root></span>

接下来就是java代码了:

<span style="font-size:18px;"><span style="white-space:pre"></span>// 首先创建一个DocumentBuilderFactory对象DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();// 通过DocumentBuilderFactory对象得到一个DocumentBuilder对象DocumentBuilder builder = dbf.newDocumentBuilder();// 指定解析哪个xml文件// 解析返回一个document节点/Document接口Document doc = builder.parse("src/class.xml");</span>
已经得到文档,接下来遍历这个文档:

</pre><pre name="code" class="java">// Node接口,底下有很多子接口,包括Documentpublic static void listNode(Node node) {// 只显示标签元素不显示空格元素if (node.getNodeType() == Node.ELEMENT_NODE) {System.out.println(node.getNodeName());}// 递归取出node的子节点NodeList childNodes = node.getChildNodes();for (int i = 0; i < childNodes.getLength(); i++) {listNode(childNodes.item(i));}}
<pre class="java" name="code">// 具体的遍历某个学生的信息public static void read(Document doc) {// doc.getElementById(elementId),如果指定该标签有id属性的话可以使用NodeList elementsByTagName = doc.getElementsByTagName("stu");for (int i = 0; i < elementsByTagName.getLength(); i++) {System.out.println(elementsByTagName.item(i));}// 取出第一个学生的信息Node stu = elementsByTagName.item(0);Element ele = (Element) stu;System.out.println("学号是   " + ele.getAttribute("num"));// 取出stu的属性,学号Element sex = (Element) (ele.getElementsByTagName("sex").item(0));// 取出介绍Element intro = (Element) ele.getElementsByTagName("intro").item(0);System.out.println(sex.getTextContent() + "介绍    "+ intro.getTextContent());}

<pre class="java" name="code">// 添加节点public static void addInfo(Document doc) throws TransformerException {// 首先创建一个新的学生节点Element stu = doc.createElement("stu");// 添加属性stu.setAttribute("stu", "sp004");// 创建name标签Element name = doc.createElement("name");name.setTextContent("小红");Element sex = doc.createElement("sex");sex.setTextContent("女");Element intro = doc.createElement("intro");intro.setTextContent("这是一个好学生");// 添加标签stu.appendChild(name);stu.appendChild(sex);stu.appendChild(intro);// 将stu添加到根节点doc.getDocumentElement().appendChild(stu);// 以上操作只是在内存中的xml树中添加了信息,并未保存到文件中// 还需要转换工厂实现保存到xml文件TransformerFactory tff = TransformerFactory.newInstance();// 得到一个转换器Transformer tf = tff.newTransformer();tf.transform(new DOMSource(doc), new StreamResult("src/class.xml"));}

删除节点和属性:

Element item = (Element) doc.getElementsByTagName("stu").item(0);//删除节点item.getParentNode().removeChild(item);// 删除属性item.removeAttribute("num");
//以上操作之后还是仅仅是在内存中操作的,并未写入文件。还需要转换器更新xml文件





0 0
原创粉丝点击