You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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 &lt;= 1">
                <xsl:value-of select="false()"/>
            </xsl:when>
            <xsl:when test="$divisor * $divisor &gt; $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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:57:32