详细的DOM解析XML文件
目录
题目与要求:
针对test.xml构造DOM解析器
1.输出所有标签名称,标签内容,以”标签名:标签内容”输出
2.在标签签名称后以”(属性,属性值)”形式输出标签内相应属性
3.给出图书质量平均值
4.给出阅读时间总量
(1)文件存放位置
这里一定要文件的存放文职正确,不然就会出现找不到文件的错误,可以参考下面的截图:
- test.dtd文件
<!ELEMENT 韩丢丢 (喜欢的图书列表,book-num*,like-book-num?)>
<!ATTLIST 韩丢丢:
班级号 CDATA #IMPLIED
学号 CDATA #REQUIRED
性别 (男|女) #REQUIRED
年龄 CDATA #REQUIRED
>
<!ELEMENT 喜欢的图书列表 (图书+)>
<!ATTLIST 喜欢的图书列表 图书数 CDATA #FIXED "4">
<!ELEMENT 图书 (图书名,图书种类,图书评价,阅读时间)>
<!ELEMENT 图书名 (#PCDATA)>
<!ELEMENT 图书种类 (#PCDATA)>
<!ELEMENT 图书评价 (#PCDATA)>
<!ATTLIST 图书评价 图书质量 CDATA #REQUIRED 图书内容 CDATA #REQUIRED>
<!ELEMENT 阅读时间 (#PCDATA)>
<!ELEMENT book-num (#PCDATA)>
<!ATTLIST book-num 是否共享 (是|否) #REQUIRED>
<!ELEMENT like-book-num (#PCDATA)>
<!ATTLIST like-book-num 是否共享 (是|否) #REQUIRED>
(2)test.xml文件
<?xml version = "1.0" encoding="utf-8"?>
<!DOCTYPE 韩丢丢 SYSTEM "test.dtd">
<!--我喜欢的图书-->
<韩丢丢 班级号="888888" 学号="99999999" 性别="男" 年龄="21">
<喜欢的图书列表 图书数="4">
<图书>
<图书名>幽默大全</图书名>
<图书种类>轻松搞笑</图书种类>
<图书评价 图书质量="90" 图书内容="90">轻松幽默</图书评价>
<阅读时间>50</阅读时间>
</图书>
<图书>
<图书名>时事评论</图书名>
<图书种类>时事政治</图书种类>
<图书评价 图书质量="80" 图书内容="85">犀利独到</图书评价>
<阅读时间>100</阅读时间>
</图书>
<图书>
<图书名>感动中国</图书名>
<图书种类>时事政治</图书种类>
<图书评价 图书质量="95" 图书内容="70">耐人寻味</图书评价>
<阅读时间>120</阅读时间>
</图书>
<图书>
<图书名>楼市分析</图书名>
<图书种类>市场分析</图书种类>
<图书评价 图书质量="85" 图书内容="95">剖析深入</图书评价>
<阅读时间>65</阅读时间>
</图书>
</喜欢的图书列表>
<book-num 是否共享="是">106</book-num>
<like-book-num 是否共享="否">50</like-book-num>
</韩丢丢>
(3)DOMtest.java文件
package dom;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
public class DOMtest {
public static void main(String[] args) {
GiveData give = new GiveData();
try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder domParser = factory.newDocumentBuilder();
Document document = domParser.parse(new File("test.xml"));
NodeList nodeList = document.getChildNodes();
give.output(nodeList);
System.out.print(" " + "阅读时间总量:" + give.total + "\n");
System.out.print(" " + "质量平均值:" + give.average / give.t);
} catch (Exception e) {
System.out.println(e);
}
}
}
class GiveData {
double total = 0, m = 0, t = 0;
double average = 0;
public void output(NodeList nodeList) {
int size = nodeList.getLength();
for (int k = 0; k < size; k++) {
Node node = nodeList.item(k);
if (node.getNodeType() == Node.TEXT_NODE) {
Text textNode = (Text) node;
String content = textNode.getWholeText();
System.out.print(content);
Element parent = (Element) textNode.getParentNode();
boolean boo = (parent.getNodeName()).equals("阅读时间");
if (boo == true) {
content = textNode.getWholeText();
total = total + Double.parseDouble(content.trim());
}
}
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element elementNode = (Element) node;
String name = elementNode.getNodeName();
System.out.print(name+":");
NamedNodeMap map = elementNode.getAttributes();
for (int m = 0; m < map.getLength(); m++) {
Attr attrNode = (Attr) map.item(m);
String attName = attrNode.getName();
String attValue = attrNode.getValue();
System.out.print("(" + attName + ":" + attValue + ")");
if (attName.equals("图书质量")) {
average = average + Double.parseDouble(attValue);
t++;
}
}
NodeList nodes = elementNode.getChildNodes();
output(nodes);
}
}
}
}
(4)结果截图
(5)感想
大家可以动手去实践一下!!!!!!!