解析这样一个XML:
<?xml version='1.0' encoding='UTF-8'?>
<config>
<global>
<projects findbugs = "true" junit = "false" cobertura = "true" checkstyle = "false"/>
</global>
<local>
<project name = "projectA" junit = "false" findbugs = "true" checkstyle = "false"/>
<project name = "projectB" junit = "false" findbugs = "true" checkstyle = "false"/>
</local>
</config>
解析也很简单:
public boolean parse() {
boolean r = false;
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(new File(filename));
XPath xPath = XPathFactory.newInstance().newXPath();
String path = null;
path = String.format("/config/local/project[@name='%s']/@findbugs", projectName);
Boolean projectFindBugs = (Boolean)xPath.evaluate(path, document, XPathConstants.BOOLEAN);
path = String.format("/config/local/project[@name='%s']/@junit", projectName);
Boolean projectJUnit = (Boolean)xPath.evaluate(path, document, XPathConstants.BOOLEAN);
path = String.format("/config/local/project[@name='%s']/@cobertura", projectName);
Boolean projectCobertura = (Boolean)xPath.evaluate(path, document, XPathConstants.BOOLEAN);
path = String.format("/config/local/project[@name='%s']/@checkstyle", projectName);
Boolean projectCheckStyle = (Boolean)xPath.evaluate(path, document, XPathConstants.BOOLEAN);
// 如果局部配置不能被正确识别,或者配置为false,再检查全局配置
if (projectFindBugs == null || !projectFindBugs.booleanValue()) {
findbugsConfigured = (Boolean) xPath.evaluate("/config/global/projects/@findbugs", document, XPathConstants.BOOLEAN);
} else {
findbugsConfigured = projectFindBugs.booleanValue();
}
if (projectJUnit == null || !projectJUnit.booleanValue()) {
junitSkip = (Boolean) xPath.evaluate("/config/global/projects/@junit", document, XPathConstants.BOOLEAN);
} else {
junitSkip = projectJUnit.booleanValue();
}
if (projectCobertura == null || !projectCobertura.booleanValue()) {
coberturaConfigured = (Boolean) xPath.evaluate("/config/global/projects/@cobertura", document, XPathConstants.BOOLEAN);
} else {
coberturaConfigured = projectCobertura.booleanValue();
}
if (projectCheckStyle == null || !projectCheckStyle.booleanValue()) {
checkstyleConfigured = (Boolean) xPath.evaluate("/config/global/projects/@checkstyle", document, XPathConstants.BOOLEAN);
} else {
checkstyleConfigured = projectCheckStyle.booleanValue();
}
r = true;
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
return r;
}