最近做项目时要使用dom4j对xml进行解析、转换、验证等操作,在网上查了好多资料,最终终于成功地把项目写出来了,这里对xml解析部分使用到的dom4j知识进行总结,方便以后查阅。
1、第一个函数的功能是写一个xml文件:
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();
}
2、第二个函数的功能是读一个xml文件
由于这次要解析的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);
}
}
3、验证xml文件是否符合xsd文件定义:
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;
}
}
4、利用xslt转换xml文件
/* 第一个参数是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 "";
}
写一篇博客总结一下,方便以后查阅!