代碼參考:
https://gitee.com/burns/ValidateXml.git
項目結構:
關鍵代碼
ValidateXMLDTD.java
package com.burns.validate.xml;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
public class ValidateXMLDTD {
public static void main(String[] args) {
// System.out.println("測試符合DTD規範的XML文件");
// testPerson();
// System.out.println("測試不符合DTD規範的XML文件");
// testWorkder();
}
public static void testPerson() {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
DocumentBuilder db = dbf.newDocumentBuilder();
db.parse(new java.io.FileInputStream("person.xml"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void testWorkder() {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
DocumentBuilder db = dbf.newDocumentBuilder();
db.parse(new java.io.FileInputStream("worker.xml"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void testXml(String xmlPath){
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
DocumentBuilder db = dbf.newDocumentBuilder();
db.parse(new java.io.FileInputStream(xmlPath));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ValidateXmlDtdTest.java
package com.burns.validate.xml;
public class ValidateXmlDtdTest {
/**
*
* @Title: main
* @Description: TODO(這裏用一句話描述這個方法的作用)
* @param @param args 參數
* @return void 返回類型
* @throws
*
* 需要注意xml中有第一dtd的信息:例如:
* <!DOCTYPE project PUBLIC "-//Mentor Graphics Corporation//Project 2012.1//EN" "C:/MentorGraphics/CHS2012/dtd/project.dtd">
*/
public static void main(String[] args){
//有問題的xml
// ValidateXMLDTD.testXml(ValidateXmlXsdTest.class.getClassLoader().getResource("Design2-1-1.xml").getPath());
//沒問題的xml
// ValidateXMLDTD.testXml(ValidateXmlXsdTest.class.getClassLoader().getResource("28-22-00_81__1589439843201.xml").getPath());
// ValidateXMLDTD.testXml("D:\\work\\上飛院\\梅挺\\20200514\\28-22-00_81__1589439843201.xml");
// ValidateXMLDTD.testXml("D:\\work\\上飛院\\梅挺\\20200514\\Design2-1-1.xml");
// ValidateXMLDTD.testXml("C:\\Users\\35725\\eclipse-workspace\\project2012dtd\\files\\javabean2xml_5.xml");
// ValidateXMLDTD.testXml("C:\\Users\\35725\\eclipse-workspace\\project2012dtd\\files\\javabean2xml_4.xml");
// ValidateXMLDTD.testXml("C:\\Users\\35725\\eclipse-workspace\\project2012dtd\\files\\sharedcomponent.xml");
}
}
ValidateXmlXsdTest.java
package com.burns.validate.xml;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.SAXValidator;
import org.dom4j.io.XMLWriter;
import org.dom4j.util.XMLErrorHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.net.URL;
import java.util.List;
public class ValidateXmlXsdTest {
public static void main(String[] args){
validateXMLByXSD();
}
public static void validateXMLByXSD() {
// 從類路徑下讀取文件
URL xmlFileName = ValidateXmlXsdTest.class.getClassLoader().getResource("import1_1.xml");
// URL xmlFileName = ValidateXmlXsdTest.class.getClassLoader().getResource("library_web_service_import_example2.xml");
// 輸出爲file:/D:/MyWorkSpace/FirstWorkSpace/validate-xml-test/target/classes/test_schema.xsd
String xsdFileName = ValidateXmlXsdTest.class.getClassLoader().getResource("LibrarySchema2014.xsd").toString();
try {
//創建默認的XML錯誤處理器
XMLErrorHandler errorHandler = new XMLErrorHandler();
//獲取基於 SAX 的解析器的實例
SAXParserFactory factory = SAXParserFactory.newInstance();
//解析器在解析時驗證 XML 內容。
factory.setValidating(true);
//指定由此代碼生成的解析器將提供對 XML 名稱空間的支持。
factory.setNamespaceAware(true);
//使用當前配置的工廠參數創建 SAXParser 的一個新實例。
SAXParser parser = factory.newSAXParser();
//創建一個讀取工具
SAXReader xmlReader = new SAXReader();
//獲取要校驗xml文檔實例
Document xmlDocument = (Document) xmlReader.read(xmlFileName);
//設置 XMLReader 的基礎實現中的特定屬性。核心功能和屬性列表可以在 [url]http://sax.sourceforge.net/?selected=get-set[/url] 中找到。
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource",xsdFileName);
//創建一個SAXValidator校驗工具,並設置校驗工具的屬性
SAXValidator validator = new SAXValidator(parser.getXMLReader());
//設置校驗工具的錯誤處理器,當發生錯誤時,可以從處理器對象中得到錯誤信息。
validator.setErrorHandler(errorHandler);
//校驗
validator.validate(xmlDocument);
// 錯誤輸出方式1
XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
//如果錯誤信息不爲空,說明校驗失敗,打印錯誤信息
if (errorHandler.getErrors().hasContent()) {
System.out.println("XML文件通過XSD文件校驗失敗!");
writer.write(errorHandler.getErrors());
} else {
System.out.println("XML文件通過XSD文件校驗成功!");
}
// 錯誤輸出方式2
System.out.println();
StringBuilder errorMsg = new StringBuilder();
if (errorHandler.getErrors().hasContent()) {
List<Element> elements = errorHandler.getErrors().elements();
for (Element element : elements) {
String line = String.valueOf(Integer.parseInt(element.attributeValue("line")) - 1);
String text = element.getText();
errorMsg.append("(第 " + line + "行出現錯誤) " + text+"\r\n");
}
errorMsg.append("XML文件通過XSD文件校驗失敗!");
System.out.println(errorMsg.toString());
}else {
System.out.println("XML文件通過XSD文件校驗成功!");
}
} catch (Exception ex) {
System.out.println("XML文件: " + xmlFileName + " 通過XSD文件:" + xsdFileName + "檢驗失敗。/n原因: " + ex.getMessage());
ex.printStackTrace();
}
}
}