xml
<CodeIssueCollection>
<CodeIssue>
<Priority>2</Priority>
<Severity>High</Severity>
<Title>Comment Appears to Contain Password</Title>
<Description>
The comment appears
<FileName>
C:\co.js
</FileName>
<Line>17</Line>
<CodeLine>
a=b
</CodeLine>
<Checked>False</Checked>
<CheckColour>LawnGreen</CheckColour>
</CodeIssue>
</CodeIssueCollection>
java
读取代码
public abstract class AbstractDigesterXmlReader {
public boolean parseXml(InputStream inputStream){
// 创建Digester对象
Digester digester = new Digester();
// 是否需要用DTD验证XML文档的合法性
digester.setValidating(false);
// 将当前对象放到对象堆的最顶层
digester.push(this);
digesterSetting(digester);
try {
digester.parse(inputStream);
return true;
} catch (Exception e) {
return false;
}
}
protected abstract void digesterSetting(Digester digester);
}
public class XmlReader extends AbstractDigesterXmlReader {
private CodeIssueCollection codeIssueCollection;
public CodeIssueCollection getCodeIssueCollection() {
return codeIssueCollection;
}
public void setCodeIssueCollection(CodeIssueCollection codeIssueCollection) {
this.codeIssueCollection = codeIssueCollection;
}
@Override
protected void digesterSetting(Digester digester) {
digester.addObjectCreate("CodeIssueCollection", CodeIssueCollection.class);
digester.addSetNext("CodeIssueCollection","setCodeIssueCollection");
digester.addObjectCreate("CodeIssueCollection/CodeIssue", CodeIssue.class);
digester.addSetNext("CodeIssueCollection/CodeIssue", "addCodeIssue");
digester.addBeanPropertySetter("CodeIssueCollection/CodeIssue/Priority","priority");
digester.addBeanPropertySetter("CodeIssueCollection/CodeIssue/Severity","severity");
digester.addBeanPropertySetter("CodeIssueCollection/CodeIssue/Title","title");
digester.addBeanPropertySetter("CodeIssueCollection/CodeIssue/Description","description");
digester.addBeanPropertySetter("CodeIssueCollection/CodeIssue/FileName","fileName");
digester.addBeanPropertySetter("CodeIssueCollection/CodeIssue/Line","line");
digester.addBeanPropertySetter("CodeIssueCollection/CodeIssue/CodeLine","codeLine");
digester.addBeanPropertySetter("CodeIssueCollection/CodeIssue/Checked","checked");
digester.addBeanPropertySetter("CodeIssueCollection/CodeIssue/CheckColour","checkColour");
}
}
封装 对象
public class CodeIssue {
private Integer priority;
private String severity;
private String title;
private String description;
private String fileName;
private Integer line;
private String codeLine;
private Boolean checked;
private String checkColour;
//getter setter
}
public class CodeIssueCollection {
private List<CodeIssue> codeIssues = new ArrayList<>();
public List<CodeIssue> getCodeIssues() {
return codeIssues;
}
public void setCodeIssues(List<CodeIssue> codeIssues) {
this.codeIssues = codeIssues;
}
public void addCodeIssue(CodeIssue codeIssue){
codeIssues.add(codeIssue);
}
}
使用
XmlReader reader = new XmlReader();
boolean result = reader.parseXml(file.getInputStream());
CodeIssueCollection CodeIssueCollectionreader.getCodeIssueCollection()
//接着就可以get到所有数据
说明
- digester.addBeanPropertySetter("CodeIssueCollection/CodeIssue/Priority","priority"); 如果xml标签和字段一致,可以省略第二个参数。
- 对于只有一个值的标签,则该标签可以作为父标签的基本类型字段,不需要声明类去对应
- 如果xml标签有属性,例如<CodeIssueCollection name="1">,则需要调用digester.addSetProperties("CodeIssueCollection"),如果属性和字段不一致,如<CodeIssueCollection Name="1">,则可以调用digester.addSetProperties("BugCollection/BugInstance/Method",new String[]{"Name"},new String[]{"name"}),一样的属性不需要在数组中声明。