最近在工作中用到了解析XML文件,網上的教程一言難盡,分享一個我自己解析XML文件的方法,記錄一下。有XML文件轉成DOM,XML文件轉成Sting,String轉DOM等各種操作。用的包是 org.w3c.dom.Document下的
/**
* @Author dengzp
* @Date 2022/3/22
* @Version 1.0
* @Description
*/
public class OperateXMLByDOM {
/**
* 將給定文件的內容或者給定 URI 的內容解析為一個 XML 文檔,並且返回一個新的 DOM Document 對象
*
* @param filePath 文件所在路徑
* @return DOM的Document對象
* @throws Exception
*/
public static Document xml2Doc(String filePath) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
FileInputStream inputStream = null;
Document doc = null;
try {
builder = factory.newDocumentBuilder();
/* 通過文件方式讀取,注意文件保存的編碼和文件的聲明編碼要一致(默認文件聲明是UTF-8) */
File file = new File(filePath);
doc = builder.parse(file);
/* 通過一個URL方式讀取 */
URI uri = new URI(filePath);
doc = builder.parse(uri.toString());
/* 通過java IO 流的讀取 */
inputStream = new FileInputStream(filePath);
doc = builder.parse(inputStream);
return doc;
} catch (Exception e) {
return null;
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
return null;
}
}
}
}
/**
* Document 轉換為 String 並且進行了格式化縮進
*
* @param doc XML的Document對象
* @return String
*/
public static String doc2FormatString(Document doc) {
StringWriter stringWriter = null;
try {
stringWriter = new StringWriter();
if (doc != null) {
OutputFormat format = new OutputFormat(doc, "UTF-8", true);
//format.setIndenting(true);//設置是否縮進,默認為true
//format.setIndent(4);//設置縮進字符數
//format.setPreserveSpace(false);//設置是否保持原來的格式,默認為 false
//format.setLineWidth(500);//設置行寬度
XMLSerializer serializer = new XMLSerializer(stringWriter, format);
serializer.asDOMSerializer();
serializer.serialize(doc);
return stringWriter.toString();
} else {
return null;
}
} catch (Exception e) {
return null;
} finally {
if (stringWriter != null) {
try {
stringWriter.close();
} catch (IOException e) {
return null;
}
}
}
}
/**
* Document 轉換為 String
*
* @param doc XML的Document對象
* @return String
*/
public static String doc2String(Document doc) {
try {
Source source = new DOMSource(doc);
StringWriter stringWriter = new StringWriter();
Result result = new StreamResult(stringWriter);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(source, result);
return stringWriter.getBuffer().toString();
} catch (Exception e) {
return null;
}
}
/**
* String 轉換為 Document 對象
*
* @param xml 字符串
* @return Document 對象
*/
public static Document string2Doc(String xml) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
Document doc = null;
InputSource source = null;
StringReader reader = null;
try {
builder = factory.newDocumentBuilder();
reader = new StringReader(xml);
source = new InputSource(reader);//使用字符流創建新的輸入源
doc = builder.parse(source);
return doc;
} catch (Exception e) {
return null;
} finally {
if (reader != null) {
reader.close();
}
}
}
/**
* Document 保存為 XML 文件
*
* @param doc Document對象
* @param path 文件路徑
*/
public static void doc2XML(Document doc, String path) {
try {
Source source = new DOMSource(doc);
Result result = new StreamResult(new File(path));
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(source, result);
} catch (Exception e) {
return;
}
}
public static void main(String[] args) {
Document doc = xml2Doc("/Users/dengzhaoping/Desktop/license.xml");
System.out.println("aa" + doc);
System.out.println("bb" + doc2String(doc));
System.out.println("cc" + doc2FormatString(doc));
doc = string2Doc(doc2FormatString(doc));
doc2XML(doc, "1.xml");
}