好了,终于想起来需要复习一下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();
}
}