如何解析带命名空间的简单XML?解决find返回None无法获取字段问题
解析带命名空间的XML字段问题
你的代码返回None的原因很明确:ns2:Email不是根节点ns2:Request的直接子节点,它嵌套在ns2:User节点内部,而find()方法默认只查找当前节点的直接子节点,不会自动递归下层节点。
下面是两种可行的解决方法:
方法一:先定位父节点,再查找子字段
先找到ns2:User节点,再从该节点下获取各个子字段:
import xml.etree.ElementTree as ET data = """ <ns2:Request xmlns:ns2="urn://www.example.com"> <ns2:User> <ns2:Name>John</ns2:Name> <ns2:Surname>Snow</ns2:Surname> <ns2:Email>joihn.show@gmail.com</ns2:Email> <ns2:Birthday>2005-10-23T04:00:00+03:00</ns2:Birthday> </ns2:User> </ns2:Request> """ namespaces = {"ns2": "urn://www.example.com"} xml = ET.fromstring(data) # 定位到User节点 user_node = xml.find("ns2:User", namespaces) # 提取各个字段文本 name = user_node.find("ns2:Name", namespaces).text surname = user_node.find("ns2:Surname", namespaces).text email = user_node.find("ns2:Email", namespaces).text birthday = user_node.find("ns2:Birthday", namespaces).text print(f"Name: {name}, Surname: {surname}, Email: {email}, Birthday: {birthday}")
方法二:直接使用层级XPath路径
通过父节点/子节点的路径格式,直接定位目标字段:
import xml.etree.ElementTree as ET data = """ <ns2:Request xmlns:ns2="urn://www.example.com"> <ns2:User> <ns2:Name>John</ns2:Name> <ns2:Surname>Snow</ns2:Surname> <ns2:Email>joihn.show@gmail.com</ns2:Email> <ns2:Birthday>2005-10-23T04:00:00+03:00</ns2:Birthday> </ns2:User> </ns2:Request> """ namespaces = {"ns2": "urn://www.example.com"} xml = ET.fromstring(data) # 直接用层级路径查找并提取文本 name = xml.find("ns2:User/ns2:Name", namespaces).text surname = xml.find("ns2:User/ns2:Surname", namespaces).text email = xml.find("ns2:User/ns2:Email", namespaces).text birthday = xml.find("ns2:User/ns2:Birthday", namespaces).text print(f"Name: {name}, Surname: {surname}, Email: {email}, Birthday: {birthday}")
额外说明
如果需要递归查找所有层级中同名的节点,可以使用findall()方法或者iter()方法遍历,但针对你当前的XML结构,上述两种方法已经足够简洁高效。
内容的提问来源于stack exchange,提问作者Альберт Александров
相关产品推荐
相关产品推荐

