apache Digester读取xml

    技术2023-10-11  102

    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"}),一样的属性不需要在数组中声明。

     

    Processed: 0.031, SQL: 9