«Нет такого доступного метода: setFields () для объекта: java.util.ArrayList» при использовании Apache Digester - PullRequest
1 голос
/ 08 июля 2010

В настоящее время я пытаюсь получить список строк из некоторого XML с помощью Apache Digester, как описано в Как добавить литеральные элементы в объект List? в разделе FAQ.

У меня возникает следующая ошибка:

[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]);

Я довольно новичок в использовании Дигестера, и мне трудно найти примеры того, что мне нужно.

Может кто-нибудь увидеть, где яидет не так?

1 Ответ

1 голос
/ 19 июля 2010

Что ж, этот вопрос принес мне значок «Tumbleweed», и я изо всех сил пытаюсь найти способ переформулировать проблему, чтобы ее было легче понять. Итак, вот обновленная информация о моем прогрессе:

В конце концов я решил отказаться от 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);

Если у кого-то есть предложения по этой проблеме, мне все еще интересно узнать, почему у меня было столько проблем с Дигестером.

...