高级文件处理(1)

mac2025-06-02  75

XML简介

1 xml,www.w3.org

可扩展标记语言: 意义+数据标签可自行定义,具有自我描述纯文本表示,跨系统/平台/语言 2 示例 <bookstore> <title lang="en">Harry potter</title> <author>J>k</author> <year>2005</year> <price>29.99</price> </bookstore>

XML解析方法

-树结构 DOM: Document Object Model 文档对象模型,擅长(小规模)读/写 -流结构 SAX: Simple API for XML 流机制解释器(推模式),擅长读 Stax: The Streaming API for XML 流机制解释器(拉模式),擅长读, DOM 是W3C 处理XML 的标准API – 直观易用。 – 其处理方式是将XML 整个作为类似树结构的方式读入内存中以 便操作及解析,方便修改。 – 解析大数据量的XML 文件,会遇到内存泄露及程序崩溃的风险。 SAX • Simple API for XML – 采用事件/流模型来解析XML 文档,更快速、更轻量。 – 有选择的解析和访问,不像DOM 加载整个文档,内存要求较低。 – SAX 对XML 文档的解析为一次性读取,不创建/不存储文档对 象,很难同时访问文档中的多处数据。 – 推模型。当它每发现一个节点就引发一个事件,而我们需要编写 这些事件的处理程序。关键类: • 查看相关例子Stax • Streaming API for XML – 流模型中的拉模型 – 在遍历文档时,会把感兴趣的部分从读取器中拉出,不需要引发 事件,允许我们选择性地处理节点。这大大提高了灵活性,以及 整体效率。 – 两套处理API • 基于指针的API,XMLStreamReader • 基于迭代器的API,XMLEventReader • 查看相关例子其他的第三方库 • DOM/SAX/Stax是JDK自带的解析功能。 • 第三方库 – JDOM: www.jdom.org – DOM4J: dom4j.github.io • 第三方库一般都包含DOM,SAX等多种方式解析,是对Java 解析进行封装。总结 • DOM:读(小规模)XML,写XML • SAX/Stax:适合读(大规模)XML (一般大于1M,是并发量)

DOM类

1 DocumentBuilder解析类的parse方法 2 Node主节点,getChildNodes返回一个NodeList 3 Document文档根节点 4 Element标签节点元素,每一个标签都是标签节点 5 Text节点,包括xml在内的都是text节点 6 attr节点,每个属性节点

//读文件 public static void recursiveTraverse() { try { // System.out.println(new File("").getPath()); //采用Dom解析xml文件 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse("users1212.xml"); //获取所有的一级子节点 NodeList usersList = document.getChildNodes(); System.out.println(usersList.getLength()); //1 for (int i = 0; i < usersList.getLength(); i++) { Node users = usersList.item(i); //1 users NodeList userList = users.getChildNodes(); //获取二级子节点user的列表 System.out.println("==" + userList.getLength()); //9 for (int j = 0; j < userList.getLength(); j++) //9 { Node user = userList.item(j); if (user.getNodeType() == Node.ELEMENT_NODE) { NodeList metaList = user.getChildNodes(); System.out.println("====" + metaList.getLength()); //7 for (int k = 0; k < metaList.getLength(); k++) //7 { //到最后一级文本 Node meta = metaList.item(k); if (meta.getNodeType() == Node.ELEMENT_NODE) { System.out.println(metaList.item(k).getNodeName() + ":" + metaList.item(k).getTextContent()); } } System.out.println(); } } } } catch (Exception e) { e.printStackTrace(); } } //得到name节点的值 public static void traverseBySearch() { try { //采用Dom解析xml文件 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse("users.xml"); Element rootElement = document.getDocumentElement(); NodeList nodeList = rootElement.getElementsByTagName("name"); if(nodeList != null) { for (int i = 0 ; i < nodeList.getLength(); i++) { Element element = (Element)nodeList.item(i); System.out.println(element.getNodeName() + " = " + element.getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } }

写xml文件

try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder(); //新创建一个Document节点 Document document = dbBuilder.newDocument(); if (document != null) { Element docx = document.createElement("document"); //都是采用Document创建元素 Element element = document.createElement("element"); element.setAttribute("type", "paragraph"); element.setAttribute("alignment", "left"); //element增加2个属性 Element object = document.createElement("object"); object.setAttribute("type", "text"); Element text = document.createElement("text"); text.appendChild(document.createTextNode("abcdefg")); //给text节点赋值 Element bold = document.createElement("bold"); bold.appendChild(document.createTextNode("true")); //给bold节点赋值 object.appendChild(text); //把text节点挂在object下 object.appendChild(bold); //把bold节点挂在object下 element.appendChild(object); //把object节点挂在element下 docx.appendChild(element); //把element节点挂在docx下 document.appendChild(docx); //把docx挂在document下 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(document); //定义目标文件 File file = new File("dom_result.xml"); StreamResult result = new StreamResult(file); //将xml内容写入到文件中 transformer.transform(source, result); System.out.println("write xml file successfully"); } } catch (Exception e) { e.printStackTrace(); } }
最新回复(0)