java代码怎样生成和解析XML文件 Java代码通常依赖于其内置或扩展的API来生成和分析XML文件如DOM、SAX、StAX以及更高层次的JAXB。这些工具各有侧重点。选择哪一个通常取决于您的具体需求文件大小、处理复杂性、是否需要对象映射等。解决方案说到用Java操作XML我个人最常用的是DOMDocument Object Model和JAXB。DOM适用于XML结构内存中的任意修改和遍历而JAXB正在处理复杂的XML Schema和Java之间的映射效率特别高。生成XML文件(以DOM为例)DOM是从零开始构建XML文件或修改现有XML结构的好选择。它的API设计直观就像操作树形结构一样。import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.File; public class XmlGenerator { public static void main(String[] args) { try { // 1. 获得DocumentbuilderFactory实例 DocumentBuilderFactory docFactory DocumentBuilderFactory.newInstance(); // 2. 获得Documentbuilder实例 DocumentBuilder docBuilder docFactory.newDocumentBuilder(); // 3. 创建新的XML文档 Document doc docBuilder.newDocument(); // 4. 创建根元素 Element rootElement doc.createElement(books); doc.appendChild(rootElement); // 5. 创建子元素 book Element book1 doc.createElement(book); rootElement.appendChild(book1); // 6. 为 book 添加属性 book1.setAttribute(id, bk101); // 7. 添加更深层次的元素和文本内容 Element title1 doc.createElement(title); title1.appendChild(doc.createTextNode(Java编程理念)); book1.appendChild(title1); Element author1 doc.createElement(author); author1.appendChild(doc.createTextNode(Bruce Eckel)); book1.appendChild(author1); Element price1 doc.createElement(price); price1.appendChild(doc.createTextNode(99.00)); book1.appendChild(price1); // 再来一个book Element book2 doc.createElement(book); rootElement.appendChild(book2); book2.setAttribute(id, bk102); Element title2 doc.createElement(title); title2.appendChild(doc.createTextNode(Effective Java)); book2.appendChild(title2); Element author2 doc.createElement(author); author2.appendChild(doc.createTextNode(Joshua Bloch)); book2.appendChild(author2); Element price2 doc.createElement(price); price2.appendChild(doc.createTextNode(85.00)); book2.appendChild(price2); // 8. 将XML文档写入文件 TransformerFactory transformerFactory TransformerFactory.newInstance(); Transformer transformer transformerFactory.newTransformer(); // 格式化输出使XML文件更容易读取 transformer.setOutputProperty(OutputKeys.INDENT, yes); transformer.setOutputProperty({http://xml.apache.org/xslt}indent-amount, 4); // 缩进4个空格 DOMSource source new DOMSource(doc); StreamResult result new StreamResult(new File(books.xml)); transformer.transform(source, result); System.out.println(XML文件 books.xml 成功生成); } catch (Exception e) { e.printStackTrace(); } } }XML文件分析(以DOM为例)在分析XML时DOM还可以将整个文件加载到内存中然后通过遍历节点树提取信息。这种方法对结构清晰、文件小的XML非常方便。import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; public class XmlParser { public static void main(String[] args) { try { File xmlFile new File(books.xml); // 假设上面生成的XML文件存在 DocumentBuilderFactory dbFactory DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder dbFactory.newDocumentBuilder(); Document doc dBuilder.parse(xmlFile); // 可选标准化XML结构删除空白文本节点等 doc.getDocumentElement().normalize(); System.out.println(根元素: doc.getDocumentElement().getNodeName()); NodeList bookList doc.getElementsByTagName(book); System.out.println(----------------------------); for (int i 0; i bookList.getLength(); i) { Node bookNode bookList.item(i); System.out.println(\n当前元素 bookNode.getNodeName()); if (bookNode.getNodeType() Node.ELEMENT_NODE) { Element bookElement (Element) bookNode; // 获取属性 System.out.println(Book ID : bookElement.getAttribute(id)); // 获取子元素内容 System.out.println(Title : bookElement.getElementsByTagName(title).item(0).getTextContent()); System.out.println(Author : bookElement.getElementsByTagName(author).item(0).getTextContent()); System.out.println(Price : bookElement.getElementsByTagName(price).item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } }XML操作中常见的陷阱有哪些在我多年的开发经验中虽然XML操作看似直接但总有一些细节容易让人“跌跌撞撞”。最常见的坑是命名空间Namespaces。当您处理的XML文档包含命名空间时无论是分析还是生成都必须特别小心。如果在分析过程中没有正确处理命名空间您可能根本找不到所需的元素如果在生成过程中错过或错误地声明命名空间则生成的XML可能无法被目标系统正确识别。我记得有一次为了调试第三方系统返回的XML需要很多时间才能找到它复杂的命名空间定义因为一个小错误XPath表达无效。二是编码问题。XML文件中的字符编码必须与解析器读取时使用的编码一致。如果XML文件声明是UTF-8但GBK被用于实际保存或者分析器默认按ISO-8859-1读取那么乱码是不可避免的。这在跨系统集成中尤为明显尤其是涉及非英文字符时。对于大型XML文件DOM分析将是一个内存杀手。因为DOM会将整个XML文件加载到内存中形成一棵树如果文件太大很容易导致OutOfmemoryEror。此时SAX或STAX成为救世主它们是流动分析器只在需要时处理数据内存占用很小。然而流动分析的缺点是不能随机访问只能按顺序读取您需要维护自己的分析状态代码将相对复杂。