最近做项目时要使用dom4j对xml进行解析、转换、验证等操作,在网上查了好多资料,最终终于成功地把项目写出来了,这里对xml解析部分使用到的dom4j知识进行总结,方便以后查阅。
public static boolean writeXml(String fileName){ boolean returnValue=false; //定义一个XML文档 Document docement=DocumentHelper.createDocument(); //设置XML文档的元素 Element rootElement=docement.addElement("创建XML文档"); rootElement.addComment("一个简单的实例"); Element nameElement=rootElement.addElement("name"); nameElement.addAttribute("属性","名字"); Element cityElement=rootElement.addElement("city"); cityElement.setText("南京"); Element homeElement=cityElement.addElement("住址"); homeElement.setText("学校宿舍"); //创建XML文档 try { // 格式化输出 OutputFormat format = OutputFormat.createPrettyPrint(); // 指定XML编码 format.setEncoding("GB2312"); XMLWriter writer=new XMLWriter(new FileWriter(new File(fileName)),format); writer.write(docement); writer.close(); return returnValue=true; } catch (Exception e) { e.printStackTrace(); } return returnValue; }
生成的xml文件如下:
<?xml version="1.0" encoding="GB2312"?> <创建XML文档> <!--一个简单的实例--> <name 属性="名字"/> <city>南京 <住址>学校宿舍</住址> </city> </创建XML文档>
有的时候或许我们并不希望把字符串写入文件,而是希望直接返回一个字符串,只要简单地修改上面程序就可达到目标:
public static String writeXml(String fileName){ //定义一个XML文档 Document docement=DocumentHelper.createDocument(); //设置XML文档的元素 Element rootElement=docement.addElement("创建XML文档"); rootElement.addComment("一个简单的实例"); Element nameElement=rootElement.addElement("name"); nameElement.addAttribute("属性","名字"); Element cityElement=rootElement.addElement("city"); cityElement.setText("南京"); Element homeElement=cityElement.addElement("住址"); homeElement.setText("学校宿舍"); //设置字符编码,返回字符串 docement.setXMLEncoding("GB2312"); return docement.asXML(); }
由于这次要解析的xml文件格式十分简单,形如:
<?xml version="1.0" encoding="GB2312"?> <course> <!--一个简单的实例--> <tec>曹老师</tec> <plc>南京</plc> <name>Linux</name> </course>
所以解析xml的代码也十分简单,既没用到递归,也没用到枚举,代码如下:
public static void readXML(String xmlUrl){ Document doc = null; try { //doc = DocumentHelper.parseText(xml); // 如果传入的字符串本身就是xml格式的,那么这条语句能够将字符串转为XML SAXReader reader = new SAXReader(); doc = reader.read(new FileReader(new File(xmlUrl))); Element rootElt = doc.getRootElement(); // 获取根节点 System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称 System.out.println("tec:" + rootElt.elementTextTrim("tec")); System.out.println("plc:" + rootElt.elementTextTrim("plc")); System.out.println("name:" + rootElt.elementTextTrim("name")); } catch (Exception e) { e.printStackTrace(); System.exit(1); } }
public static boolean testXML(String xmlUrl, String schemaUrl){ try{ SAXReader reader = new SAXReader(); reader.setValidation(true); reader.setFeature("http://xml.org/sax/features/validation", true); reader.setFeature("http://apache.org/xml/features/validation/schema", true); //如果已经在xml文件中指定了xsd,这条语句可以没有 reader.setProperty( "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation", schemaUrl ); XMLErrorHandler errorHandler = new XMLErrorHandler(); reader.setErrorHandler(errorHandler); reader.read(new FileReader(new File(xmlUrl))); //如果传入的第一个参数本身就是xml文件,请调用下面这条语句 //reader.read(new StringReader(xmlString) ); if (errorHandler.getErrors().hasContent()) { return false; } else { return true; } } catch (Exception e) { e.printStackTrace(); return false; } }
/* 第一个参数是xml文件路径,第二个参数是xslt文件路径,返回的字符串表示转换后的xml文件 */ public static String transferXML(String xmlURL, String xsltURL){ try{ SAXReader reader = new SAXReader(); Document document = reader.read(new FileReader(new File(xmlURL))); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(new StreamSource(xsltURL)); DocumentSource source = new DocumentSource( document ); DocumentResult result = new DocumentResult(); transformer.transform( source, result ); Document transformedDoc = result.getDocument(); transformedDoc.setXMLEncoding("GB2312"); return document.asXML(); }catch (Exception e) { System.out.println("2、转化文件格式错误!"); System.exit(1); } return ""; }