如何使用PyXB从生成类中获取doc元素的文本值?
解决PyXB中混合内容元素的文本提取问题
哦,这个坑我之前踩过!PyXB处理混合内容元素(就是既有文本又嵌套子元素的元素,比如你的<doc>)的时候,不会直接把元素的文本值作为属性返回,而是生成一个包含所有内容节点的对象——这就是你调用root.doc得到<asdf_classes.documentation object...>的原因。
要提取<doc>里的"some text ",可以用以下两种方法:
方法1:遍历orderedContent()提取文本节点
PyXB为混合内容元素提供了orderedContent()方法,它会返回元素内所有内容的有序列表,其中纯文本会以字符串形式存在,子元素则是对应的绑定类实例。我们只需要过滤出字符串部分即可:
# 假设root是你的XML根对象 doc_text = "" for content_item in root.doc.orderedContent(): # 判断当前内容是否是纯文本节点 if isinstance(content_item, str): doc_text += content_item print(doc_text) # 输出: "some text "
如果需要清理多余的空格,可以加上strip()或者根据需求调整文本处理逻辑。
方法2:利用toxml()提取后处理(不推荐,仅作补充)
如果你只是快速获取元素内的所有文本(包括子元素里的),可以先把<doc>元素转成XML字符串,再用字符串处理提取文本,但这种方法不如第一种精准:
doc_xml_str = root.doc.toxml() # 这里需要用字符串替换或正则去掉所有标签,比如: import re clean_text = re.sub(r'<.*?>', '', doc_xml_str) print(clean_text) # 输出: "some text some more text even more text"
不过这种方法会把所有子元素的文本也一并提取出来,如果你只需要<doc>本身的直接文本,还是第一种方法更可靠。
总结一下:PyXB对混合内容的设计就是把所有内容节点(文本+子元素)封装成对象,必须显式遍历提取文本节点才能拿到你要的"some text "。
内容的提问来源于stack exchange,提问作者user3270371
相关产品推荐
相关产品推荐

