Java_xml_Dom解析方式

1.Node准备

Node接口是整个文档对象模型的主要数据类型,它表示该文档树中的单个节点。例如Attr, CharacterData, Comment, Text,Element都是Node的子类。 xml解析的误区: 在xml文件解析过程中,所有信息都被当做一个对象,例如解析下面的语句

 

/*

 * <book>AAA<name>java语法</name>BBB</book>

 * 该book下的直接子节点有3个,AAA和BBB被解析为CharacterData类型的节点,<name>被解析为Element类型的节点,

 * 

 * <book> <name>java语法</name> </book>

 * 该book下的直接子节点有3个,由于在<name>之前有个换行,CharacterData类型的节点

 * <book><name>java语法</name></book> 该book下的直接子节点只有1个

 */

 

2.Dom解析优缺点

优点:整个文档读入内存,方便操作:支持修改、删除和重现排列等多种功能。

缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间。

3.Dom解析xml

 

/**

 * 解析xml文件,遍历并所有信息

 */

public static void parseXMl() {

	try {

	// 1.通过DocumentBuilder工厂得到对应的xml解析器

		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		DocumentBuilder builder = factory.newDocumentBuilder();



	// 2.通过解析器得到Document对象

		Document doc = builder.parse("d:/my.xml");

		

	// 3.解析数据

	/*

	 * <book>

	 * 		<name>javaWeb</name>

	 * 		<author>fanglx</author> 

	 * 		<price>30.90</price> 

	 * </book>

	 */

		//得到所有的book的标签的nodelist

		NodeList nodeList = doc.getElementsByTagName("book");

		//遍历每个book节点

		for(int i=0; i<nodeList.getLength(); i++){

			Node node = nodeList.item(i);	//当前遍历的book节点

			//得到该book节点下的所有的直接子节点

			NodeList childNodes = node.getChildNodes();

			for(int j=0; j<childNodes.getLength(); j++){

				Node childNode = childNodes.item(j);

				//如果当前的childNode节点是一个标签,CharacterData类型的文本节点则不执行

				if(childNode instanceof Element){	

					String fieldName = childNode.getNodeName();	//当前节点名称 比如author

					String value = childNode.getTextContent();	//当前节点的text值比如fanglx

					/*

					 * 或者下面方式得到value值

					 * String value = childNode.getFirstChild().getNodeName();//fanglx

					 */

					System.out.println(fieldName+"="+value);	//author=fanglx

				}

			}

		}

	} catch (Exception e) {

		e.printStackTrace();

	}

}
/**

 * 对xml文件的更新

 */

public static void updateXMl() {

	try {

	// 1.通过DocumentBuilder工厂得到对应的xml解析器

		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		DocumentBuilder builder = factory.newDocumentBuilder();

		

	// 2.通过解析器得到Document对象

		Document doc = builder.parse("d:/my.xml");

	

	// 3.更新数据

	/*

	 * <book>

	 * 		<name>javaWeb</name>

	 * 		<author>fanglx</author> 

	 * 		<price>30.90</price> 

	 * </book>

	 */

		NodeList nodeList = doc.getElementsByTagName("book");

		Element parentEle = (Element) nodeList.item(0);

		

		//直接在子标签的尾部增加<num id="1001">25</num>

		Element childEle = doc.createElement("num");

		childEle.setAttribute("id", "1001");//设置属性

		childEle.setTextContent("25");		//设置值	

		parentEle.appendChild(childEle);

		

		//直接在price标签前面增加<age id="25">mm</age>

		Element newChild = doc.createElement("age");

		newChild.setAttribute("id", "25");	//设置属性

		newChild.setTextContent("mm");		//设置值

		Element refChild = (Element) parentEle.getElementsByTagName("price").item(0);

		parentEle.insertBefore(newChild, refChild);

		

	// 4.保存更新的数据

		TransformerFactory tFactory = TransformerFactory.newInstance();

		Transformer transformer = tFactory.newTransformer();

		transformer.transform(new DOMSource(doc), new StreamResult(new File("c:/my.xml")));

	} catch (Exception e) {

		e.printStackTrace();

	}

}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<books>   

	<book>   

		<name>javaWeb</name>    

		<author>fanglx</author>

		<price>30.90</price>      

	</book>

</books>

 

你可能感兴趣的:(java)