You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中解析AWS Mechanical Turk的返回答案?

解析Mechanical Turk的QuestionFormAnswers XML获取实际答案内容

你提到Assignment类的answer()方法会返回这样的XML格式字符串:

blahtoplevel

要提取里面的实际答案内容(比如示例里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:58:04