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文档的标准方法吗?
答案 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到答案的地图。