如何在Java中解析AWS Mechanical Turk的返回答案?
解析Mechanical Turk的QuestionFormAnswers XML获取实际答案内容
你提到Assignment类的answer()方法会返回这样的XML格式字符串:
blah toplevel
要提取里面的实际答案内容(比如示例里的toplevel),关键是要处理XML的命名空间——因为这个XML带有xmlns属性,直接查找标签会找不到,得先指定命名空间映射。下面给你两种常用的Python实现方案:
方案一:使用Python标准库xml.etree.ElementTree
这是Python自带的XML解析模块,不需要额外安装:
import xml.etree.ElementTree as ET # 替换成你从answer()拿到的XML字符串 xml_response = '''<?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>''' # 解析XML字符串 root = ET.fromstring(xml_response) # 定义MTurk的命名空间映射 mturk_namespace = {'mt': 'http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2005-10-01/QuestionFormAnswers.xsd'} # 提取单个答案 free_text = root.find('.//mt:Answer/mt:FreeText', mturk_namespace).text print(f"提取的答案:{free_text}") # 输出:提取的答案:toplevel # 如果有多个Answer,遍历获取所有问题和答案 for answer in root.findall('.//mt:Answer', mturk_namespace): question_id = answer.find('mt:QuestionIdentifier', mturk_namespace).text answer_content = answer.find('mt:FreeText', mturk_namespace).text print(f"问题ID {question_id} 的答案:{answer_content}")
方案二:使用lxml库(更灵活的XPath支持)
如果你已经安装了lxml(可以用pip install lxml安装),写法会更简洁,XPath支持也更强大:
from lxml import etree xml_response = '''<?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>''' root = etree.fromstring(xml_response) mturk_namespace = {'mt': 'http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2005-10-01/QuestionFormAnswers.xsd'} # 直接用XPath提取文本内容 answer_text = root.xpath('//mt:Answer/mt:FreeText/text()', namespaces=mturk_namespace)[0] print(f"提取的答案:{answer_text}") # 同样支持批量遍历 for answer in root.xpath('//mt:Answer', namespaces=mturk_namespace): question_id = answer.find('mt:QuestionIdentifier', mturk_namespace).text answer_content = answer.find('mt:FreeText', mturk_namespace).text print(f"问题ID {question_id} 的答案:{answer_content}")
核心要点就是必须指定命名空间,否则XML解析器会找不到对应的标签。两种方案都能轻松拿到你需要的实际答案内容,根据自己的项目依赖选择就行。
内容的提问来源于stack exchange,提问作者rococo
相关产品推荐
相关产品推荐

