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

一.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



 
   
    小丽  
      
    这是一个好学生 
    
   
    小红  
      
    这是一个好学生 
      
  
    黄晓明
    
    这不是一个好学生
  

接下来就是java代码了:

		// 首先创建一个DocumentBuilderFactory对象
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// 通过DocumentBuilderFactory对象得到一个DocumentBuilder对象

		DocumentBuilder builder = dbf.newDocumentBuilder();
		// 指定解析哪个xml文件
		// 解析返回一个document节点/Document接口
		Document doc = builder.parse("src/class.xml");
已经得到文档,接下来遍历这个文档:

// Node接口,底下有很多子接口,包括Document
	public 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));

		}
	}

// 具体的遍历某个学生的信息
	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());

	}

 
  
// 添加节点
	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文件





你可能感兴趣的:(xml,内存溢出,dom)