apache Digester读取xml

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

猜你喜欢

转载自blog.csdn.net/sinat_33472737/article/details/107108049