Как мне разобрать ответы от AWS Mechanical Turk на Java? - PullRequest
0 голосов
/ 01 мая 2018

Метод answer() для Assignment возвращает String, например:

<?xml version="1.0" encoding="ASCII"?><QuestionFormAnswers xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2005-10-01/QuestionFormAnswers.xsd"><Answer><QuestionIdentifier>blah</QuestionIdentifier><FreeText>toplevel</FreeText></Answer></QuestionFormAnswers>

Как я должен разобрать это, чтобы получить реальные ответы? Я вижу в более старых версиях API тип QuestionFormAnswers. На это также ссылаются в документации, которая гласит:

public String getAnswer ()

Ответы работника, представленные для HIT, содержащиеся в документе QuestionFormAnswers, если работник предоставил ответ. Если работник не предоставляет никаких ответов, ответ может содержать документ QuestionFormAnswers, или ответ может быть пустым.

Возвращает:

Ответы работника, представленные для HIT, содержатся в документе QuestionFormAnswers, если работник предоставил ответ. Если работник не предоставляет никаких ответов, ответ может содержать документ QuestionFormAnswers, или ответ может быть пустым.

Но на самом деле он возвращает строку, а не QuestionFormAnswers. Как мне разобрать эту строку XML-результат? Могу ли я просто использовать любой стандартный метод анализа XML-документов?

1 Ответ

0 голосов
/ 01 мая 2018

Ответ, похоже, да, вы можете использовать любую стандартную технику синтаксического анализа XML.

Вот что у меня сработало:

private static Map<String, String> parseXML(String answerXML) {
    try {
        List<String> identifierList = new ArrayList<>();
        List<String> answerList = new ArrayList<>();
        InputSource is = new InputSource(new StringReader(answerXML));
        Document document = null;
        document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList identifiers = null;
        try {
            identifiers = (NodeList) xpath.evaluate("//Answer/QuestionIdentifier", document,
                    XPathConstants.NODESET);
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < identifiers.getLength(); i++) {
            Node identifier = identifiers.item(i);
            String relation = identifier.getTextContent();
            identifierList.add(relation);
        }
        NodeList texts = (NodeList) xpath.evaluate("//Answer/FreeText", document, XPathConstants.NODESET);
        for (int i = 0; i < texts.getLength(); i++) {
            Node text = texts.item(i);
            String answer = text.getTextContent();
            answerList.add(answer);
        }
        Map<String, String> result = new HashMap<>();
        for (int k = 0; k < identifierList.size(); k++) {
            result.put(identifierList.get(k), answerList.get(k));
        }
        return result;
    } catch (Exception e) {
        log.error("Failed to parse XML " + answerXML, e);
    }
    return null;
}

Это создает карту из входных идентификаторов для ответов.

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