public static void checkFileContainContaintIncludeOrImport(File sourceFile,
Set<String> fileNameSet,
XSDContainType xsdContainType) throws Exception {
FileInputStream inputStream = new FileInputStream(sourceFile);
// 如果该文件已经被处理和分析过,就不再进行分析了。通过文件路径进行分析
if (fileNameSet.contains(sourceFile.getAbsolutePath())) {
return;
} else {
fileNameSet.add(sourceFile.getAbsolutePath());
}
// 解析引用的import文件的include文件
InputStream in = null;
Reader reader = null;
SAXReader saxReader = null;
try {
in = new FileInputStream(sourceFile);
reader = new InputStreamReader(in, "utf-8"); // 注意编码问题
saxReader = new SAXReader();
Document doc = saxReader.read(reader);
Element currentRoot = doc.getRootElement();
Element childNode = null;
for (Iterator<Element> it = currentRoot.elements("import").iterator(); it.hasNext();) {
xsdContainType.setImportFile(true);
childNode = (Element) it.next();
String refPath = childNode.attributeValue("schemaLocation");
// 迭代与拷贝文件的处理是相同的,处理import
File importFile = new File(sourceFile.getParent() + File.separatorChar + refPath);
checkFileContainContaintIncludeOrImport(importFile, fileNameSet, xsdContainType);
}
for (Iterator<Element> it = currentRoot.elements("include").iterator(); it.hasNext();) {
xsdContainType.setIncludeFile(true);
childNode = (Element) it.next();
String refPath = childNode.attributeValue("schemaLocation");
// 迭代与拷贝文件的处理是相同的,处理import
File importFile = new File(sourceFile.getParent() + File.separatorChar + refPath);
checkFileContainContaintIncludeOrImport(importFile, fileNameSet, xsdContainType);
}
} finally {
if (reader != null) {
try {
reader.close();
} catch (Exception e) {
logger.error("", e);
}
}
if (in != null) {
try {
in.close();
} catch (Exception e) {
logger.error("", e);
}
}
}
}