解析xml时,可以使用的技术很多,但纵向比较下来,其实在Java中使用Dom4J 进行xml读取其实已经足够,在google上查阅资料后,得出的结论便是Dom4J最好使,所以现在记一笔。关于SAX,Dom,JDom怎么样,我不在赘述,有需要的朋友可以去一下博客仔细阅读,各取所需。地址如下:
JAVA读XML:sax,dom,jdom,dom4j的比较以及选择
使用Dom4J需要引入的jar包,如果想优雅地找到推荐看我的另一篇博客
使用Dom4J进行解析关键代码
//使用SAXReader对文件进行读取
SAXReader saxReader = new SAXReader();
File file = new File("data.xml");
//将XML内容读取到document对象中
Document document = saxReader.read(file);
以下列xml代码为例,做演示。
data.xml
<?xml version="1.0" encoding="UTF-8"?>
<save-data>
<now-status>
<correct-num>11</correct-num>
<incorrect-num>11</incorrect-num>
<spare-num>20</spare-num>
<now-position>22</now-position>
</now-status>
<total-num>149</total-num>
</save-data>
解析该xml代码
//获取根节点下的所有子节点 save-data -> now-status/total-num
List<?> nodeList = document.getRootElement().elements();
for (Object o : nodeList) {
Element element = (Element) o;
//若无子节点则可读出当前结点的值
if (!element.isTextOnly()){
List<?> childElements = element.elements();
//获取根节点下的第二层元素中的子节点 now-status -> correct-num/incorrect-num/spare-num/now-position
for (Object childElement : childElements) {
System.out.println(((Element)childElement).getName()+":"+((Element)childElement).getText());
}
}else {
//读出total-num的值
System.out.println(element.getName()+":"+element.getText());
}
}
输出结果为
correct-num:11
incorrect-num:11
spare-num:20
now-position:22
total-num:149
进行优化后,使用迭代进行所有节点值的访问,在这里我使用HashMap进行存储,如果是多个相同对象的XML,请使用其他的方式进行存储,否则会覆盖原来对象的值。
迭代方式代码:
public static Map<String, String> getChild(Element element){
Map<String, String> valueMap = new HashMap<>();
Iterator<Node> childNodes = element.nodeIterator();
while (childNodes.hasNext()){
Node node = childNodes.next();
if (node instanceof Element){
Element e = (Element) node;
if (e.isTextOnly()){
valueMap.put(e.getName(), e.getText());
}else {
//迭代 合并迭代后的值
valueMap.putAll(getChild(e));
}
}
}
return valueMap;
}
dom4j 对XML文件进行某个属性值的修改,并且完成存储
关键代码
//可根据XML结点深度,自行放置参数,并完成修改值和保存XML
public static void modifyNode(Document document, String nowVal, String... keyValues) throws IOException, DocumentException {
Element targetElement = document.getRootElement().element(keyValues[0]);
for (int i = 1; i < keyValues.length; i++) {
targetElement = targetElement.element(keyValues[i]);
if (i == keyValues.length-1){
targetElement.setText(nowVal);
}
}
//设置好修改的数据后,要将修改的xml保存到原文件中
//指定文件输出位置
FileOutputStream out = null;
try {
out = new FileOutputStream(filePath);
OutputFormat format = OutputFormat.createPrettyPrint();//标准化布局,适合查看时显示。
//创建写入文件并指定文件格式
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(out,format);
//写入文件
writer.write(document);
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
XML中,Node和Element的区别:
来自StackOverflow:
What’s the difference between an element and a node in XML?
A node can be an element node, an attribute node, a text node, or any
other of the node types explained in the “Node types” chapter.
大意:一个node可以是element node ,一个attribute node, 一个 text node, 或者一些其他“Node types”所描述的node 类型.
An XML element is everything from (including) the element’s start tag
to (including) the element’s end tag.
大意:一个XML element 是涵盖了所有元素的起始标签和结束标签。
就范围而言:element>node
若有理解错误之处,烦请指出,谢谢!