&引用;对象java.util.ArrayList上没有这样的可访问方法:setFields();当使用Apache Digester时

&引用;对象java.util.ArrayList上没有这样的可访问方法:setFields();当使用Apache Digester时,java,apache-commons-digester,Java,Apache Commons Digester,我目前正试图使用Apache Digester使用一些XML中的字符串列表,如常见问题部分所述 我遇到了以下错误: [DEBUG] Digester - [SetNextRule]{job/editorial/articlegroup/article} Call java.util.ArrayList.setFields([This, This, is, is, a, a, test, test, , , , ]) [ERROR] Digester - End event threw excep

我目前正试图使用Apache Digester使用一些XML中的字符串列表,如常见问题部分所述

我遇到了以下错误:

[DEBUG] Digester - [SetNextRule]{job/editorial/articlegroup/article} Call java.util.ArrayList.setFields([This, This, is, is, a, a, test, test, , , , ])
[ERROR] Digester - End event threw exception <java.lang.NoSuchMethodException: No such accessible method: setFields() on object: java.util.ArrayList>java.lang.NoSuchMethodException: No such accessible method: setFields() on object: java.util.ArrayList
[DEBUG]Digester-[SetNextRule]{job/editorial/articlegroup/article}调用java.util.ArrayList.setFields([This,This,is,is,a,a,test,test,,]))
[错误]摘要器-结束事件引发异常java.lang.NoSuchMethodException:对象java.util.ArrayList上没有此类可访问的方法:setFields()
我正在使用的XML的简化版本如下:

<job>
    <editorial>
        <articlegroup>
            <article>
                <text>
                    <content><![CDATA[This]]></content>
                </text>
                <text>
                    <content><![CDATA[is]]></content>
                </text>
                <text>
                    <content><![CDATA[a]]></content>
                </text>
                <text>
                    <content><![CDATA[test]]></content>
                </text>
            </article>
        </articlegroup>
    </editorial>
</job>

和源代码:

public class PPJob {

    List<String> fields;

    public List<String> getFields() {
        return fields;
    }
    public void setFields(List<String> fields) {
        this.fields = fields;
    }
}


addObjectCreate("job", PPJob.class);
addSetProperties("job");

addObjectCreate("job/editorial/articlegroup/article", ArrayList.class);
addCallMethod("job/editorial/articlegroup/article/text/content", "add", 1);
addCallParam("job/editorial/articlegroup/article/text/content", 0);
addSetNext("job/editorial/articlegroup/article", "setFields");

PPJob result = (PPJob)super.parse([THE XML]);
公共类PPJob{
列表字段;
公共列表getFields(){
返回字段;
}
公共无效设置字段(列表字段){
this.fields=字段;
}
}
addObjectCreate(“作业”,PPJob.class);
addSetProperties(“作业”);
addObjectCreate(“作业/编辑/文章组/文章”,ArrayList.class);
addCallMethod(“工作/编辑/文章组/文章/文本/内容”,“添加”,1);
addCallParam(“作业/编辑/文章组/文章/文本/内容”,0);
addSetNext(“作业/编辑/文章组/文章”,“设置字段”);
PPJob result=(PPJob)super.parse([XML]);
我几乎是一个使用消化器的新手,我很难找到我需要的例子


有人能看出我错在哪里吗?

这个问题为我赢得了“风滚草”徽章,我正在努力找到某种方法来重新解释这个问题,以便更容易理解。下面是我的最新进展:

我最终决定放弃Commons Digester,由于时间限制,很难进一步了解这个问题,因此我没有在Digester项目中记录错误(如果其他人告诉我,我会分享我的经验)

javax XPath函数对于满足我的需求更为直接,我决定采用以下解决方案:

XPathFactory factory = XPathFactory.newInstance();
XPath xPath = factory.newXPath();
rootQuery = xPath.compile("/job");
textFieldsQuery = xPath.compile("/job/editorial/articlegroup/article/text|/job/editorial/articlegroup/article/flashtext");

Node rootNode = (Node)rootQuery.evaluate(new InputSource(is), XPathConstants.NODE);

PPJob job = new PPJob();
Map<String, String> jobTextFields = new HashMap<String, String>(); 
NodeList fields = (NodeList)query.evaluate(rootNode, XPathConstants.NODESET);
for (int i = 0; i < fields.getLength(); i++) {
    Node field = fields.item(i);
    String fieldName = field.getAttributes().getNamedItem("name").getNodeValue();
    String fieldContent = field.getNextSibling().getNodeValue();
    jobTextFields.put(fieldName, fieldContent);
}       
job.setTextFields(jobTextFields);
XPathFactory=XPathFactory.newInstance();
XPath=factory.newXPath();
rootQuery=xPath.compile(“/job”);
textFieldsQuery=xPath.compile(“/job/editorial/articlegroup/article/text |/job/editorial/articlegroup/article/flashtext”);
Node rootNode=(Node)rootQuery.evaluate(新的InputSource(is),XPathConstants.Node);
PPJob job=新的PPJob();
Map jobTextFields=新建HashMap();
NodeList字段=(NodeList)query.evaluate(rootNode,XPathConstants.NODESET);
对于(int i=0;i

如果有人对这个问题有什么建议的话,我还是很想听听为什么我在消化器上遇到这么多麻烦。

这个问题为我赢得了“风滚草”徽章,我正在努力寻找一些方法来重新解释这个问题,以便更容易理解。下面是我的最新进展:

我最终决定放弃Commons Digester,由于时间限制,很难进一步了解这个问题,因此我没有在Digester项目中记录错误(如果其他人告诉我,我会分享我的经验)

javax XPath函数对于满足我的需求更为直接,我决定采用以下解决方案:

XPathFactory factory = XPathFactory.newInstance();
XPath xPath = factory.newXPath();
rootQuery = xPath.compile("/job");
textFieldsQuery = xPath.compile("/job/editorial/articlegroup/article/text|/job/editorial/articlegroup/article/flashtext");

Node rootNode = (Node)rootQuery.evaluate(new InputSource(is), XPathConstants.NODE);

PPJob job = new PPJob();
Map<String, String> jobTextFields = new HashMap<String, String>(); 
NodeList fields = (NodeList)query.evaluate(rootNode, XPathConstants.NODESET);
for (int i = 0; i < fields.getLength(); i++) {
    Node field = fields.item(i);
    String fieldName = field.getAttributes().getNamedItem("name").getNodeValue();
    String fieldContent = field.getNextSibling().getNodeValue();
    jobTextFields.put(fieldName, fieldContent);
}       
job.setTextFields(jobTextFields);
XPathFactory=XPathFactory.newInstance();
XPath=factory.newXPath();
rootQuery=xPath.compile(“/job”);
textFieldsQuery=xPath.compile(“/job/editorial/articlegroup/article/text |/job/editorial/articlegroup/article/flashtext”);
Node rootNode=(Node)rootQuery.evaluate(新的InputSource(is),XPathConstants.Node);
PPJob job=新的PPJob();
Map jobTextFields=新建HashMap();
NodeList字段=(NodeList)query.evaluate(rootNode,XPathConstants.NODESET);
对于(int i=0;i

如果有人对这个问题有什么建议,我仍然很想听听我为什么会在消化器上遇到这么多麻烦。

这不是你问题的答案,请不要按原样写,也不要标记为正确的。@logoff-不正确。如果海报上说它解决了他们的问题(就像他们在这里做的那样),那么这就是问题的解决方案。有时,解决方案是更改需求。@注销如果您的答案能更简洁地解决问题,我将非常乐意将您的答案标记为正确答案。然而Chris是对的,我的问题的答案是重新思考我的方法,这也是我目前向其他人推荐的方法。为什么这不是一个答案?提出解决问题的替代方法的答案当然是可以接受的。来自帮助中心:“答案可以是“不要那样做”,但也应该包括“试试这个”。任何让询问者朝着正确的方向走的答案都是有帮助的……”你可能会觉得这有点太离谱了,但听起来好像让问者朝着正确的方向走,这似乎是一个非常可靠的“改为试试这个”式回答。这不是你问题的答案,请不要按原样写,也不要标记为正确答案。@logoff-不正确。如果海报上说它解决了他们的问题(就像他们在这里做的那样),那么这就是问题的解决方案。有时,解决方案是改变需求