【编程练习】明日非舟抽卡模拟器(2)xml文件解析

为了修改与添加方便,将干员的信息放在简历类 Resume 中,简历信息使用 xml 文件存储,在启动时加载进来。

本项目连载 github 库地址

参考链接

解析 xml 文件

需要 import 进来的内容如下,jdk1.8 全部自带,不需要额外下载。

1
2
3
4
5
6
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

获取文档对象

解析方式如下:

  • 首先获取一个工厂类(DocumentBuilderFactory)实例,使用了单例模式所以得用newInstance()来获取全局对象
  • 再用获得的工厂对象来创建文档解析器(DocumentBuilder
  • 最后才能够利用文档解析器来解析文档(Document
1
2
3
4
5
String path = "Melantha.xml";
//解析xml文件
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(path);

这里DocumentBuilder对象的parse()方法可以直接传入 String 类型的字符串文件路径,也可以传入文件对象,例如:

1
2
3
4
5
6
7
import java.io.File;
String path = "Melantha.xml";
File f=new File(path);
//解析xml文件
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(f);

DOM 方式获取文档数据

此处引用自:Java DOM 简介-w3cSchool

例如,我们有以下 xml 结构:

1
<yourTag>This is an <bold>important</bold> test.</yourTag>

DOM 节点的层级如下,其中每行代表一个节点:

1
2
3
4
5
ELEMENT: yourTag
+ TEXT: This is an
+ ELEMENT: bold
+ TEXT: important
+ TEXT: test.

yourTag元素包含文本,后跟一个子元素,后跟另外的文本。

节点类型

为了支持混合内容,DOM 节点非常简单。标签元素的“内容”标识它是的节点的类型。

例如, 节点内容是元素yourTag的名称。

DOM 节点 API 定义nodeValue()nodeType()nodeName()方法。

对于元素节点< yourTag>nodeName()返回 yourTag,而 nodeValue()返回 null。

对于文本节点+ TEXT:这是一个nodeName()返回#text,nodeValue()返回“This is an”。

虽然这里写的用nodeValue(),但现在用的是getValue()这样子的方法。

载入单份 xml 文件示例代码

需要解析的 xml 文件的内容:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<resume>
<name>玫兰莎</name>
<star>3</star>
<chat>......玫兰莎。从现在起,我的利刃将为您所用。</chat>
<portrayal>image/Melantha.jpg</portrayal>
</resume>

代码部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 载入简历对象
* @param path 简历文件路径
* @return 简历对象
*/
public Resume loadResume(String path) {
Resume resume = null;
try{
//解析xml文件
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(path);

String nameString= doc.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
String starString= doc.getElementsByTagName("star").item(0).getFirstChild().getNodeValue();
int starInt = Integer.valueOf(starString);
String chatString= doc.getElementsByTagName("chat").item(0).getFirstChild().getNodeValue();
String portrayalString= doc.getElementsByTagName("portrayal").item(0).getFirstChild().getNodeValue();


resume = new Resume(nameString, starInt, chatString, portrayalString);
resume.show();
}catch(Exception e){
e.printStackTrace();
}

return resume;
}

【编程练习】明日非舟抽卡模拟器(2)xml文件解析

https://yxchangingself.xyz/posts/Africanights_simu_hr_2/

作者

憧憬少

发布于

2020-02-04

更新于

2020-02-04

许可协议