如何使用XPath选择元素的混合内容(文本+元素)且不含父标签?
如何用XPath提取元素内的文本和子标记(不含父元素标签)?
示例XML
<fig> <title>An H<sub>2</sub>O molecule</title> <image href="h2oMolecule.jpg"/> </fig>
需求
在<fig>的上下文下,提取<title>标签内的全部内容(包含普通文本和<sub>子标记),但不包含<title>本身,最终要得到:
An H<sub>2</sub>O molecule
已尝试的无效表达式
child::title/*:仅返回<sub>2</sub>,漏掉了前后的文本节点child::title/text():仅得到An H和O molecule,漏掉了<sub>元素child::title/node():虽能选中所有子节点(文本+元素),但多数工具不会自动将节点序列化为完整字符串,仅显示元素节点
可行解决方案
1. XPath 2.0+ 直接实现
使用XPath 2.0及以上版本的serialize()函数,直接将选中的所有子节点序列化为XML字符串:
serialize(child::title/node())
该函数会把<title>下的文本节点和<sub>元素完整拼接成你需要的内容。
2. XPath 1.0 结合宿主语言处理
XPath 1.0没有内置序列化功能,需要借助宿主语言(如XSLT、Python等)来处理选中的节点集合:
- XSLT方式:
编写模板匹配<title>的子节点并输出:<xsl:template match="fig/title"> <xsl:copy-of select="node()"/> </xsl:template> - Python lxml方式:
选中节点后,逐个序列化再拼接:from lxml import etree xml_content = """<fig> <title>An H<sub>2</sub>O molecule</title> <image href="h2oMolecule.jpg"/> </fig>""" root = etree.fromstring(xml_content) target_nodes = root.xpath("title/node()") result = ''.join([etree.tostring(node, encoding='unicode') for node in target_nodes]) print(result)
内容的提问来源于stack exchange,提问作者T. Carano
相关产品推荐
相关产品推荐

