如何在PySpark DataFrame中用XPath提取XML嵌套结构为字符串
解决PySpark提取XML完整节点字符串的问题
问题原因
你之前用xpath函数尝试提取<description>内容失败,核心原因是:
xpath函数默认提取的是节点的文本值或属性,而非节点本身的完整XML结构;- 用
/bookstore/book/description/*只会返回description的子节点列表,且返回的是子节点的文本内容(不是XML结构); text()针对description节点时,因为它没有直接的文本内容(只有嵌套子节点),所以返回NULL。
正确解决方案
PySpark提供了xpath_string函数,可以直接将选中的XML节点序列化为完整的字符串。步骤如下:
- 导入所需函数:
from pyspark.sql.functions import col, xpath_string
- 使用
xpath_string提取完整的<description>节点:
df = df.withColumn( "nested_content", xpath_string(col("original_content"), "/bookstore/book/description") )
效果验证
针对你提供的示例XML:
"<?xml version="1.0" encoding="UTF-8"?><bookstore><book category="cooking"><title lang="en">Everyday Italian</title><author>Giada De Laurentiis</author><description><tag1>Example text 1</tag1><tag2>Example text 2</tag2><tag4>Example text 3</tag4></description><year>2005</year><price>30.00</price></book></bookstore>"
执行上述代码后,nested_content列会得到你需要的结果:
"<description><tag1>Example text 1</tag1><tag2>Example text 2</tag2><tag4>Example text 3</tag4></description>"
注意事项
- 确保你的PySpark版本支持
xpath_string(Spark 3.0+版本已包含该函数); - XPath路径要准确匹配XML结构,避免因层级错误导致提取失败。
内容的提问来源于stack exchange,提问作者Krushna
相关产品推荐
相关产品推荐

