Dom解析XML文件具体用法
public class Dom4j { public static void main(String[] args) throws Exception { List<Student> list = parseXml(); for (Student s : list) { System.out .println(s.getId() + ":" + s.getName() + ":" + s.getAge()); } } public static List<Student> parseXml() throws Exception { // 定义工厂 API,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器。 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 定义 API, 使其从 XML 文档获取 DOM 文档实例。使用此类,应用程序员可以从 XML 获取一个 Document。 // 此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取。 // 获取此类的实例之后,将可以从各种输入源解析 XML。这些输入源有 InputStreams、Files、URL 和 SAX // InputSources。 // 注意,此类重用了 SAX API 中的一些类。这并不要求底层 DOM 实现的实现者使用 SAX 解析器将 XML 文档解析为 // Document。 // 它仅要求该实现使用这些现有的 API 与应用程序交流。 DocumentBuilder db = dbf.newDocumentBuilder(); // Document 接口表示整个 HTML 或 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据的基本访问。 // 因为元素、文本节点、注释、处理指令等不能存在于 Document 的上下文之外,所以 Document // 接口还包含所需的创建这些对象的工厂方法。 // 所创建的 Node 对象具有 ownerDocument 属性,该属性将 Node 对象与创建这些对象时的上下文所属的 Document // 关联起来 Document doc = db.parse("C:/Users/xmc/Desktop/student.xml"); // XPathFactory 实例可用于创建 XPath 对象 XPathFactory xFactory = XPathFactory.newInstance(); // XPath 提供了对 XPath 计算环境和表达式的访问。 // 如果在没有上下文项的情况下请求计算表达式,则将使用一个空文档节点作为上下文。 // 为计算 XPath 表达式,应将 DocumentFragment 视为 Document 节点。 // 如果表达式包含变量引用,则其值将通过 XPathVariableResolver 找到, // 其中 XPathVariableResolver 是通过 // setXPathVariableResolver(XPathVariableResolver resolver) 设置的。 // 如果变量解析器未定义或解析器对变量返回 null,则引发 XPathExpressionException。 // 在任何单个计算过程中,变量的值必须是不可变的。 XPath path = xFactory.newXPath(); // NodeList 接口提供对节点的有序集合的抽象,没有定义或约束如何实现此集合。DOM 中的 NodeList 对象是活动的。 // NodeList 中的项可以通过从 0 开始的整数索引进行访问。 NodeList nodes = (NodeList) path.evaluate("/students/student", doc, XPathConstants.NODESET); // 创建一个Student集合用于存放反序列化之后的每个Student节点构成的Student对象 List<Student> list = new ArrayList<Student>(); // 从NodeList集合中挨个取出元素转换成Student对象存入Student集合中 for (int i = 0; i < nodes.getLength(); i++) { Node node = nodes.item(i); list.add(nodeToStudent(node)); } return list; } /** *将XML中的一个Student节点转换成Student对象 */ public static Student nodeToStudent(Node node) { XPathFactory xPathFactory = XPathFactory.newInstance(); XPath xPath = xPathFactory.newXPath(); Student s = new Student(); Double id = null; String name = null; Double age = null; try { id = (Double) xPath.evaluate("id", node, XPathConstants.NUMBER); name = (String) xPath.evaluate("name", node, XPathConstants.STRING); age = (Double) xPath.evaluate("age", node, XPathConstants.NUMBER); } catch (Exception e) { e.printStackTrace(); } s.setId(id.intValue()); s.setName(name); s.setAge(age.intValue()); return s; } }
/** * @author xmc * Student实体,与XML中的节点对应 */ class Student { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }