解决xml缩进和添加第二本书的问题 (问题已解决)

来源:2-3 生成节点间的文本

Raven1

2016-07-22 02:08

package imooc.dmtest;

import java.io.File;
import java.io.IOException;

import javax.lang.model.element.Element;
import javax.swing.text.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DOMTest {

	/**
	 * 创建一个DocumentBuilder
	 * @return
	 */
	public DocumentBuilder getDocumentBuilder() {
		// 创建一个DocumentBuilderFactory的对象
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// 创建DocumentBuilder对象
		DocumentBuilder db = null;
		try {
			db = dbf.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
		return db;
	}

	/**
	 * 解析XMl文件
	 */
	public void xmlParser() {

		try {

			// 通过DocumentBuilder对象的parser方法加载book.xml文件到当前项目下
			org.w3c.dom.Document document = getDocumentBuilder().parse("book.xml");
			// 获取所有book节点的集合
			NodeList booklist = document.getElementsByTagName("book");
			// 通过nodelist的getlength()方法可以获取booklist的长度
			System.out.println("一共有" + booklist.getLength() + "本书");
			// 遍历每一个book节点
			for (int i = 0; i < booklist.getLength(); i++) {
				System.out.println("==========================下面开始遍历第" + (i + 1) + "这本书的内容==========");
				// 通过item(i)获取一个book节点,Nodelist的索引值从0开始
				Node book = booklist.item(i);
				// 获取book节点的所有属性集合
				NamedNodeMap attrs = book.getAttributes();
				System.out.println("第" + (i + 1) + "本书共有" + attrs.getLength() + "个属性");
				for (int j = 0; j < attrs.getLength(); j++) {
					// 通过item(intex)方法获取book节点的某一个属性
					Node attr = attrs.item(j);
					// 获取属性名
					System.out.print("属性名:" + attr.getNodeName());
					// 获取属性值
					System.out.println("--属性值" + attr.getNodeValue());

				}
				// 前提:已经知道book节点有些只有一个id属性
				// 讲book节点强制进行类型转换,转换成Element类型
				// org.w3c.dom.Element book = (org.w3c.dom.Element)
				// booklist.item(i);
				// //获取属性值
				// String attrValue = book.getAttribute("id");
				// System.out.println("id属性的属性值为"+ attrValue);
				// 解析book节点的子节点
				NodeList childNodes = book.getChildNodes();
				// 遍历childNodes获取每个节点的节点名和节点值
				System.out.println("第" + (i + 1) + "本书共有" + childNodes.getLength() + "个子节点");
				for (int k = 0; k < childNodes.getLength(); k++) {
					// 区分出text类型的node以及Element类型的node
					if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
						// 获取了element类型节点的节点名
						System.out.print(childNodes.item(k).getNodeName() + ":");
						// 获取了element类型节点的节点值
						// System.out.println(childNodes.item(k).getFirstChild().getNodeValue());
						System.out.println(childNodes.item(k).getTextContent());
					}
				}
				System.out.println("=========================结束遍历第" + (i + 1) + "这本书的内容==========");
			}
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 生成xml的方法
	 */

	public void createXML() {
		// 创建DOMTest对象
		DocumentBuilder db = getDocumentBuilder();
		org.w3c.dom.Document document = db.newDocument();
		document.setXmlStandalone(true);
		org.w3c.dom.Element bookstore = document.createElement("bookStore");
		// 向bookstore根节点中添加子节点book
		
		org.w3c.dom.Element book = document.createElement("book");
		org.w3c.dom.Element name = document.createElement("name");
		org.w3c.dom.Element author = document.createElement("author");
		org.w3c.dom.Element year = document.createElement("year");
		org.w3c.dom.Element price = document.createElement("price");
		
		org.w3c.dom.Element language = document.createElement("language");
		
//		name.setNodeValue("xiaomingzi");行不通
		name.setTextContent("小王子");
		author.setTextContent("安托万·德·圣·埃克苏佩里");
		year.setTextContent("1942");
		price.setTextContent("22");
		
		book.appendChild(name);
		book.appendChild(author);
		book.appendChild(year);
		book.appendChild(price);
		//设置book的属性
		book.setAttribute("id", "1");
		// 将book节点添加到bookstore根节点中
		bookstore.appendChild(book);
		
		//此处尝试添加第二本书,之前由于变量名重复造成失败,现在改变量名之后成功添加第二本书
		org.w3c.dom.Element book1 = document.createElement("book");
		org.w3c.dom.Element name1 = document.createElement("name");
		org.w3c.dom.Element author1 = document.createElement("author");
		org.w3c.dom.Element year1 = document.createElement("year");
		org.w3c.dom.Element price1 = document.createElement("price");
		name1.setTextContent("冰与火之歌");
		author1.setTextContent("乔治马丁");
		year1.setTextContent("2014");
		price1.setTextContent("89");
		
		book1.appendChild(name1);
		book1.appendChild(author1);
		book1.appendChild(year1);
		book1.appendChild(price1);
		book1.setAttribute("id", "2");
		bookstore.appendChild(book1);
		
		// 将bookstores节点(已经包含了book)添加到dom树中
		document.appendChild(bookstore);

		// 创建TransformFactory对象
		TransformerFactory tff = TransformerFactory.newInstance();
		try {
			Transformer tf = tff.newTransformer();
			// 设置换行
			tf.setOutputProperty(OutputKeys.INDENT, "yes");
			//设置缩进量
			tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
			tf.transform(new DOMSource(document), new StreamResult(new File("books1.xml")));
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}

	}

	/**
	 * 主方法,程序的入口
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// 创建DOMTest对象
		DOMTest test = new DOMTest();
		// 调用解析方法,解析XMl文件
		test.createXML();
	}
}


写回答 关注

1回答

  • 大喵一枚
    2016-07-22 07:30:17

    问题已解决呢就没什么看的了

Java眼中的XML 文件写入

举例说明JAVA程序如何生成XML文档,多种生成方式任你选择

55804 学习 · 132 问题

查看课程

相似问题