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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值