我目前正在尝试使用Apache Digester使用一些XML的字符串列表,如FAQ的How do I add literal elements to a List object?部分所述。
我遇到以下错误:
[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
我使用的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]);
我对于使用Digester几乎是一个新手,而且我很难找到所需的示例。
谁能看到我要去哪里错了?
最佳答案
好吧,这个问题为我赢得了“风滚草”徽章,而我正努力寻找某种方法来重新表达问题,以便更容易理解。因此,这是我的进度更新:
我决定最终放弃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);
如果有人对这个问题有建议,我仍然很想知道为什么我在消化器上遇到这么多麻烦。