如何从XML文档中筛选number属性为质数的完整badge元素?
解决方法
核心逻辑是:遍历文档中所有<badge>元素,提取其number属性值并转为数值类型,用你已实现的质数判断函数校验,通过校验的就保留整个元素节点。
以下是几种常见场景的实现方式:
1. Python + xml.etree.ElementTree
假设你的质数判断函数叫is_prime(n),示例代码如下:
import xml.etree.ElementTree as ET def is_prime(n): # 你的质数判断实现,比如: if n <= 1: return False for i in range(2, int(n**0.5) + 1): if n % i == 0: return False return True # 解析XML文档 tree = ET.parse("your_file.xml") root = tree.getroot() # 筛选符合条件的badge元素 prime_badges = [] for badge in root.findall(".//badge"): num_str = badge.get("number") try: num = int(num_str) if is_prime(num): prime_badges.append(badge) except ValueError: # 处理number属性不是有效数字的情况 pass # 现在prime_badges里就是所有符合条件的完整badge元素 # 可以输出或进一步处理,比如转为字符串: for badge in prime_badges: print(ET.tostring(badge, encoding="utf-8").decode())
2. Python + lxml(支持XPath自定义函数)
如果用lxml库,可以把质数判断函数注册到XPath上下文,直接用XPath表达式筛选,更简洁:
from lxml import etree def is_prime(n): # 你的质数判断实现 if n <= 1: return False for i in range(2, int(n**0.5) + 1): if n % i == 0: return False return True # 解析XML tree = etree.parse("your_file.xml") ns = etree.FunctionNamespace(None) ns["isPrime"] = lambda ctx, num: is_prime(int(num)) # 用XPath筛选 prime_badges = tree.xpath("//badge[isPrime(@number)]") # 输出结果 for badge in prime_badges: print(etree.tostring(badge, encoding="utf-8").decode())
3. XSLT(如果用样式表处理XML)
如果用XSLT处理,可以在样式表中实现质数判断逻辑,直接输出符合条件的<badge>元素:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <root> <xsl:apply-templates select="//badge[my:isPrime(@number)]"/> </root> </xsl:template> <xsl:template match="badge"> <xsl:copy-of select="."/> </xsl:template> <!-- 质数判断模板 --> <xsl:template name="isPrime"> <xsl:param name="n"/> <xsl:param name="divisor" select="2"/> <xsl:choose> <xsl:when test="$n <= 1"> <xsl:value-of select="false()"/> </xsl:when> <xsl:when test="$divisor * $divisor > $n"> <xsl:value-of select="true()"/> </xsl:when> <xsl:when test="$n mod $divisor = 0"> <xsl:value-of select="false()"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="isPrime"> <xsl:with-param name="n" select="$n"/> <xsl:with-param name="divisor" select="$divisor + 1"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- 包装函数方便在XPath中调用 --> <xsl:function name="my:isPrime" xmlns:my="http://example.com"> <xsl:param name="n"/> <xsl:call-template name="isPrime"> <xsl:with-param name="n" select="$n"/> </xsl:call-template> </xsl:function> </xsl:stylesheet>
不管用哪种方式,核心都是先定位所有badge元素,再对每个元素的number属性做质数校验,保留校验通过的完整元素,而不是只提取数值。
内容的提问来源于stack exchange,提问作者Rick Sanchez
相关产品推荐
相关产品推荐

