XML解析与写入之DOM方式

好了,终于想起来需要复习一下XML了。整个复习下来怎么说呢?关于XML文件的解析与写入,知识点说真的不难,当然这也取决于你对JavaScript语言对DOM的操作的理解程度。为什么这么说呢?因为XML和HTML本来就是互通的嘛。只不过后者具有更强的语义,更完善的标准。怎么说呢,我们做后端开发的,如果有精力的话,去从根源研究下XML的知识是很有必要的,譬如说自己怎么去写一个 schema或者dtd的约束文件等等。当然我只是一个即将实习的学生,研究工作都是以后工作中不断提升自己所必须经历的了,与各位共勉。我这里就直接粘贴代码吧,因为代码中的注释很详细,大家也就拿来做个参考吧,因为我们的记忆力不是那么的无敌。本篇文章是java原生的DOM解析。

使用的XMl文件book.xml:

 

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
	<book  id ="1" c ="computer">
		<name>浪潮之巅</name>
		<author>吴军</author>
		<year>2013</year>
		<price>50.0</price>
	</book>
	<book id="2" c ="math">
	    <name>数学之美</name>
		<year>2015</year>
		<price>48.2</price>
	    <language>英语</language>
	</book>
</bookstore>

 

 

 

解析方法:

public void parseXML() {
		// 1、创建一个DocumentBuilderFactory对象
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

		try {
			// 2、创建DocumentBuilder对象
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 3、解析指定文件,转为Document对象
			Document document = db.parse("src/book.xml");
			// 根据节点名称保存为book的NodeList对象
			NodeList booklist = document.getElementsByTagName("book");
			// 使用方法getLength()来获取booklist的长度
			int length = booklist.getLength();
			// 获取属性名和属性值(遍历每一个book节点)
			for (int i = 0; i < length; i++) {
				// 通过item(i)方法获取一个book节点
				Node book = booklist.item(i);
				System.out.println("当前遍历的是第:" + (i + 1) + "本书");
				// 获取book节点的所有属性
				NamedNodeMap attrs = book.getAttributes();
				// 遍历book的属性
				for (int j = 0; j < attrs.getLength(); j++) {
					Node attr = attrs.item(j);
					// 获取属性名
					System.out.print("属性名:" + attr.getNodeName() + "---");
					// 获取属性值
					System.out.println("属性值:" + attr.getNodeValue());
				}

				// 解析book节点的子节点
				NodeList childList = book.getChildNodes();
				for (int j = 0; j < childList.getLength(); j++) {
					// 区分text类型的node以及element的类型的node
					if (childList.item(j).getNodeType() == Node.ELEMENT_NODE) {
						System.out.print("节点名:"
								+ childList.item(j).getNodeName() + "---");
						// 因为使用DOM解析时,DOM会把节点值当做节点的子节点
						System.out.println("节点值:"
								+ childList.item(j).getFirstChild()
										.getNodeValue());
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

 

 

写入方法:

	public void createXML() {
		// 1、创建一个DocumentBuilderFactory对象
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			// 2、创建DocumentBuilder对象
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 创建新的document
			Document document = db.newDocument();
			// 不让XML文件的头部属性出现Standalone属性
			document.setXmlStandalone(true);

			Element bookStore = document.createElement("bookStore");
			// 向bookStoregen根节点中添加book节点
			Element book = document.createElement("book");
			// 为book节点添加属性
			book.setAttribute("id", "1");
			book.setAttribute("c", "computer");
			Element name = document.createElement("name");
			// 在DOM中为标签添加文本的唯一有效方式
			name.setTextContent("浪潮之巅");
			book.appendChild(name);
			bookStore.appendChild(book);
			// 将bookStore节点添加到DOM树中
			document.appendChild(bookStore);

			// 下面的操作是将生成的DOM树转为XML文件
			TransformerFactory tff = TransformerFactory.newInstance();
			Transformer transformer = tff.newTransformer();
			// 设置格式化(自动换行等,但是效果不是很好)
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			// 第一个参数指定写入XML文件的DOM源,第二个参数是XML输出专用流
			transformer.transform(new DOMSource(document), new StreamResult(
					"src/book1.xml"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值