如何从Java中解析AWS Mechanical Turk的答案?

时间:2018-05-01 03:57:06

标签: java xml amazon-web-services mechanicalturk

Assignment的{​​{1}}方法会返回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()

     

如果工人提供答案,则提交给QuestionFormAnswers文档中包含的HIT的工作者答案。如果工作人员没有提供任何答案,答案可能包含QuestionFormAnswers文件,或者答案可能为空。

     

返回:

     

如果工人提供答案,则提交给QuestionFormAnswers文档中包含的HIT的工作者答案。如果工作人员没有提供任何答案,答案可能包含QuestionFormAnswers文件,或者答案可能为空。

但它实际上返回一个String而不是QuestionFormAnswers。如何解析此字符串XML结果?我可以使用任何解析XML文档的标准方法吗?

1 个答案:

答案 0 :(得分:0)

答案似乎是肯定的,您可以使用任何标准的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;
}

这会创建一个从输入ID到答案的地图。