问题描述:
解析XML树形结构的思路:
XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。
XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。
方法选择:
DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。
JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
解决方案:
需要解析如下结构的xml文件
<root>
<system number="1" taskcode ="XX11" coderegion="0" type = "1">
<first-system number="1" code="R" name="测试软件">
<second-system number="1" name="2">
<third-system number="1" code="R" name="测试软件">
<element number="1" code="RX" name="软件"></element>
<element number="3" code="2" name="2"></element>
</third-system>
</second-system>
</first-system>
</system>
</root>
废话不多说上代码:
public static String verifyCproduct(List<String> list) {
SAXReader reader = new SAXReader();
File file = new File("./configuration.xml");
try {
Document document = reader.read(file);
//获取根root
Element root = document.getRootElement();
//获取第一级system
List<Element> systemElements = root.elements();
for (Element system: systemElements) {
//获取第二级firstSystem
List<Element> firstSystemElements = system.elements();
for (Element firstSystem: firstSystemElements) {
//获取第三级secondSystem
List<Element> secondSystemElements = firstSystem.elements();
for (Element secondSystem: secondSystemElements){
//获取第四级thirdSystem
List<Element> thirdSystemElements = secondSystem.elements();
for (Element thirdSystem: thirdSystemElements){
//获取最后一级,对其中的属性进行判断
List<Element> Elements = secondSystem.elements();
for (Element element: Elements){
//判断名称以及代号是否一致
if (list.get(8).equals(element.attributeValue("code")) && list.get(7).equals(element.attributeValue("name"))){
return "验证成功";
}
}
}
}
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
return "未在配置中查询到相关信息,验证失败";
}
代码分析:
如果需要使用到dom4j,这部分代码是通用的,然后就是通过一级向下调用。
SAXReader reader = new SAXReader(); // 创建SAXReader的对象reader
File file = new File("./configuration.xml");
Document document = reader.read(file); // 通过reader对象的read方法加载.xml文件,获取docuemnt对象。
一级一级调用就是通过.elements方法获取下一级,将下面所有元素以list形式存储。
List<Element> systemElements = root.elements();//就是获取root下面的element
//已知属性名情况下
System.out.println("name: " + systemElements.attributeValue("name"));
//已知子元素名的情况下
System.out.println("title" + child.elementText("title"));
如果有什么问题或者写的不好请发消息给我 ,感谢!附上jar包下载地址
链接:https://pan.baidu.com/s/16GCgCpaF7dc33pMbK2sTLg
密码:z444