当前位置:

首页 > 编程开发 > Python处理XML数据:ElementTree解析全攻略

Python处理XML数据:ElementTree解析全攻略

Python处理XML数据首选ElementTree,其核心步骤为:1.解析XML;2.查找元素;3.访问数据;4.修改结构;5.写回文件。ElementTree无需额外安装,功能强大且直观高效,支持从字符串或文件解析,通过find()、findall()等方法查找元素,并能创建、修改和删除节点。处理大型XML时推荐使用iterparse()实现流式解析,避免内存问题。对于命名空间,需手动拼接QName或通过字典辅助构造完整标签名。此外,Python还有lxml(性能强、支持XPath/XSLT)、min

本文目录

    Python处理XML数据首选ElementTree,其核心步骤为:1.解析XML;2.查找元素;3.访问数据;4.修改结构;5.写回文件。ElementTree无需额外安装,功能强大且直观高效,支持从字符串或文件解析,通过find()、findall()等方法查找元素,并能创建、修改和删除节点。处理大型XML时推荐使用iterparse()实现流式解析,避免内存问题。对于命名空间,需手动拼接QName或通过字典辅助构造完整标签名。此外,Python还有lxml(性能强、支持XPath/XSLT)、minidom(标准DOM风格)和sax(事件驱动)等库应对不同需求。

    怎样用Python处理XML数据?ElementTree解析方法

    Python处理XML数据,ElementTree无疑是标准库中的首选,它提供了一种直观且高效的方式来解析、操作和生成XML文档。在我看来,它最大的优点在于“开箱即用”,不需要额外安装任何库,对于大多数日常的XML处理任务来说,它的功能已经足够强大了。

    怎样用Python处理XML数据?ElementTree解析方法

    解决方案

    使用ElementTree处理XML数据,通常会经历几个核心步骤:解析XML、查找元素、访问数据、修改结构,以及最后将修改写回文件。整个过程,说实话,挺符合我们对树形数据结构操作的直觉。

    怎样用Python处理XML数据?ElementTree解析方法

    首先,你需要导入xml.etree.ElementTree模块,通常我们会把它简写成ET,这样代码看起来更简洁。

    import xml.etree.ElementTree as ET
    
    # 假设我们有一个XML字符串或者一个XML文件
    xml_string = """
    
        
            Gambardella, Matthew
            XML Developer's Guide
            Computer
            44.95
            2000-10-01
            An in-depth look at creating applications with XML.
        
        
            Ralls, Kim
            Midnight Rain
            Fantasy
            5.95
            2000-12-16
            A young man's struggle to come to grips with his tumultuous past.
        
    
    """
    
    # 1. 解析XML数据
    # 如果是字符串,用fromstring()
    root = ET.fromstring(xml_string)
    
    # 如果是文件,用parse()
    # tree = ET.parse('your_file.xml')
    # root = tree.getroot() # 获取根元素

    解析完成后,我们就得到了一个Element对象,它代表了XML的根元素。接下来就是如何在这个树里“寻宝”了。

    怎样用Python处理XML数据?ElementTree解析方法
    # 2. 查找元素和访问数据
    # 获取根元素的标签名
    print(f"根元素: {root.tag}") # 输出: 根元素: catalog
    
    # 遍历所有直接子元素
    print("\n所有书籍信息:")
    for book in root:
        print(f"  书本ID: {book.get('id')}") # 获取元素的属性值,用.get()方法
        print(f"  作者: {book.find('author').text}") # 查找子元素,并获取其文本内容,用.text属性
        print(f"  标题: {book.find('title').text}")
        print("-" * 20)
    
    # 查找特定元素:比如找到所有价格大于10的书
    print("\n价格大于10的书:")
    for book in root.findall('book'): # findall() 返回所有匹配的子元素列表
        price_elem = book.find('price')
        if price_elem is not None and float(price_elem.text) > 10:
            print(f"  标题: {book.find('title').text}, 价格: {price_elem.text}")

    ElementTree的find()方法只返回第一个匹配的子元素,而findall()则返回所有匹配的子元素列表。对于更复杂的查找,比如基于属性值,你可能需要结合循环和条件判断,或者稍微变通一下。

    # 3. 修改XML结构
    # 比如,给第一本书添加一个“库存”信息
    first_book = root.find('book') # 获取第一本书
    if first_book is not None:
        # 创建新元素并添加到first_book下
        stock_elem = ET.SubElement(first_book, 'stock')
        stock_elem.text = '100'
        print("\n添加库存信息后的第一本书结构:")
        ET.dump(first_book) # 临时打印Element内容,方便调试
    
    # 修改一个现有元素的值
    # 比如,把第二本书的价格改为6.95
    second_book = root.findall('book')[1] # 获取第二本书
    if second_book is not None:
        price_elem = second_book.find('price')
        if price_elem is not None:
            price_elem.text = '6.95'
            print(f"\n第二本书的新价格: {price_elem.text}")
    
    # 删除一个元素
    # 比如,删除第一本书的描述信息
    desc_elem = first_book.find('description')
    if desc_elem is not None:
        first_book.remove(desc_elem)
        print("\n删除描述信息后的第一本书结构:")
        ET.dump(first_book)

    操作完成后,通常需要将修改后的XML写回到文件。

    # 4. 将修改写回XML文件
    # tree = ET.ElementTree(root) # 如果一开始是用parse()创建的tree对象,直接用它
    # 如果是从字符串fromstring()创建的,需要重新创建一个ElementTree对象
    modified_tree = ET.ElementTree(root)
    
    # write()方法可以指定输出文件、编码和是否包含XML声明
    # modified_tree.write('modified_catalog.xml', encoding='utf-8', xml_declaration=True)
    
    # 也可以直接打印到控制台,便于查看完整结构
    print("\n最终修改后的XML内容:")
    ET.dump(root)

    ElementTree的API设计得非常简洁,这让它在处理大多数XML任务时显得游刃有余。当然,它也有自己的特点,比如对XPath支持的有限性,有时候会让我觉得需要多写几行代码来达到目的,但总体而言,它是一个非常可靠的工具。

    处理XML命名空间时ElementTree有哪些注意事项?

    命名空间(Namespace)在XML中是一个挺常见的概念,它主要是为了避免元素或属性名称冲突。比如,两个不同的XML方言可能都有一个</code>元素,但它们代表的含义完全不同。命名空间就是用来区分这些的。我个人觉得,处理命名空间是ElementTree新手最容易“踩坑”的地方。</p><p>ElementTree在解析带有命名空间的XML时,会将命名空间URI和本地名称组合起来,形成一个“QName”格式的标签,比如<code>{http://www.example.com/ns}element_name</code>。这意味着,如果你直接用<code>find('element_name')</code>去查找,很可能什么都找不到,因为你没有提供完整的QName。</p><p>我的经验是,通常有两种处理方式:</p><ol><li><p><strong>使用完整的QName字符串</strong>:这是最直接的方式,但缺点是如果命名空间URI很长,代码会显得比较冗长,可读性会差一些。</p><pre class='brush:language-python;toolbar:false;'>ns_xml = """ <data xmlns="http://www.example.com/ns" xmlns:prod="http://www.example.com/products"> <item> <prod:name>Laptop</prod:name> <prod:price>1200</prod:price> </item> </data> """ root_ns = ET.fromstring(ns_xml) # 查找默认命名空间下的item item = root_ns.find('{http://www.example.com/ns}item') if item is not None: print(f"\n找到的item标签: {item.tag}") # 查找带有前缀的命名空间下的name prod_name = item.find('{http://www.example.com/products}name') if prod_name is not None: print(f" 产品名称: {prod_name.text}")</pre></li><li><p><strong>通过<code>namespaces</code>参数传递命名空间字典</strong>:这是我更推荐的方式,尤其是当XML文档中包含多个命名空间,或者你希望代码更清晰时。你可以定义一个字典,将命名空间前缀映射到它们的URI。这样,在<code>find()</code>或<code>findall()</code>时,你就可以使用更简洁的“前缀:标签名”格式,并把这个字典传给<code>namespaces</code>参数。</p><pre class='brush:language-python;toolbar:false;'>namespaces = { 'default': 'http://www.example.com/ns', 'prod': 'http://www.example.com/products' } # 注意:这里find/findall的第一个参数依然是完整的QName,但ElementTree的某些版本或lxml库支持直接使用前缀。 # 对于标准库ElementTree,你仍然需要拼接完整的QName或者在find/findall方法中传入namespaces参数(如果方法支持)。 # 实际上,ElementTree的find/findall方法本身不直接接受namespaces参数来解析前缀。 # 你依然需要手动构造QName,或者通过迭代来处理。 # 比如: item_by_ns = root_ns.find(f"{{{namespaces['default']}}}item") if item_by_ns: print(f"\n通过字典和拼接找到的item标签: {item_by_ns.tag}") prod_name_by_ns = item_by_ns.find(f"{{{namespaces['prod']}}}name") if prod_name_by_ns: print(f" 通过字典和拼接找到的产品名称: {prod_name_by_ns.text}") # 另一种更通用的做法是,直接处理根元素的命名空间,然后查找。 # ElementTree.QName 可以帮助构造完整的QName # from xml.etree.ElementTree import QName # qname_item = QName(namespaces['default'], 'item') # item_qname = root_ns.find(qname_item.text) # if item_qname: # print(f"通过QName对象找到的item标签: {item_qname.tag}")</pre><p>这里需要澄清一下,标准库的<code>ElementTree.find()</code>和<code>findall()</code>方法本身并没有直接的<code>namespaces</code>参数让你传入字典来解析<code>'prod:name'</code>这种形式。你仍然需要手动构造完整的QName字符串,或者在遍历时做处理。<code>lxml</code>库在这方面提供了更方便的XPath支持,可以直接使用前缀。这可能是我之前使用<code>lxml</code>比较多,思维有点跳跃了。对于纯粹的ElementTree,记住要用完整的URI来查找,或者自己写个小函数来辅助构造QName。</p></li></ol><h3>如何高效处理大型XML文件,避免内存问题?</h3><p>处理大型XML文件确实是个挑战,尤其是当文件大到无法一次性加载到内存中时。如果直接使用<code>ET.parse()</code>,它会把整个XML文件解析成一个完整的ElementTree对象,这对于几个GB大小的文件来说,内存占用会非常恐怖,甚至直接导致程序崩溃。</p><p>这时候,我通常会转向<code>ET.iterparse()</code>。它提供了一种事件驱动的解析方式,不会一次性加载整个文档。它会逐个元素地解析,并在遇到开始标签、结束标签或文本内容时触发事件。这就像是“流式”处理,你只需要处理当前事件对应的元素,处理完就可以释放它的内存,而不是把所有东西都留在内存里。</p><pre class='brush:language-python;toolbar:false;'># 假设有一个非常大的XML文件 'large_data.xml' # 为了演示,我们先模拟一个大文件内容 import io large_xml_content = """<root>""" for i in range(10000): # 模拟10000个item large_xml_content += f"<item id='{i}'><name>Item {i}</name><value>{i*10}</value></item>" large_xml_content += "</root>" # 使用io.StringIO来模拟文件对象 xml_file_like_object = io.StringIO(large_xml_content) # 使用iterparse进行事件驱动解析 # iterparse() 返回一个迭代器,每次迭代产生 (event, element) 对 # event 可以是 'start', 'end', 'start-ns', 'end-ns' # element 是当前事件对应的Element对象 print("\n使用iterparse处理大型XML文件:") total_value = 0 # 指定events=['end'],只在遇到元素的结束标签时处理,这样可以确保元素的所有子内容都已解析 for event, elem in ET.iterparse(xml_file_like_object, events=['end']): if elem.tag == 'item': # 找到item元素,处理其子元素 value_elem = elem.find('value') if value_elem is not None: try: total_value += int(value_elem.text) except (ValueError, TypeError): print(f"警告: 无法解析item {elem.get('id')} 的值.") # 重点:处理完当前元素后,清除它及其子元素的引用 # 这样ElementTree就可以释放这些元素占用的内存 elem.clear() # 清除当前元素的子元素和属性 print(f"所有item的总值: {total_value}") # 重新定位到文件开头,以便再次解析(如果需要) xml_file_like_object.seek(0) # 如果你只需要某个特定标签的元素,可以在iterparse时指定tag参数 # 比如只处理<item>标签的结束事件 print("\n使用iterparse指定标签处理:") item_count = 0 for event, elem in ET.iterparse(xml_file_like_object, events=['end'], tag='item'): item_count += 1 # 这里也可以对elem进行处理 elem.clear() # 同样,处理完就清除 print(f"总共有 {item_count} 个item元素。")</pre><p><code>iterparse</code>的关键在于<code>elem.clear()</code>这一步。如果没有它,ElementTree仍然会把所有解析过的元素保留在内存中,导致内存泄漏。<code>clear()</code>方法会移除元素的子元素和属性,从而让Python的垃圾回收机制能够回收这些不再需要的对象。这就像是你在处理完一页文件后,立刻把它撕掉扔进碎纸机,而不是堆在桌上直到整个房间都满了。</p><h3>除了ElementTree,Python还有哪些处理XML的库,它们各有什么特点?</h3><p>ElementTree作为标准库的一部分,确实很方便。但如果你的需求更复杂,或者对性能有极高的要求,Python生态系统里还有其他一些非常出色的XML处理库,它们各有侧重。</p><ol><li><p><strong>lxml</strong>:</p><ul><li><strong>特点</strong>:这是我个人在ElementTree无法满足需求时,最常转向的库。<code>lxml</code>是Python绑定了C语言库<code>libxml2</code>和<code>libxslt</code>的结果,所以它的<strong>性能非常卓越</strong>,通常比ElementTree快很多倍,尤其是在处理大型文件时。</li><li><strong>功能</strong>:它不仅提供了与ElementTree兼容的API(意味着你可以很平滑地从ElementTree迁移),还<strong>完整支持XPath和XSLT</strong>。这意味着你可以用非常简洁强大的XPath表达式来查找元素,这在处理复杂XML结构时简直是神器。它也支持SAX和DOM解析方式。</li><li><strong>适用场景</strong>:对性能有严格要求、需要复杂XPath查询、或者需要进行XSLT转换的场景。不过,它不是标准库,需要额外安装。</li></ul></li><li><p><strong>xml.dom.minidom</strong>:</p><ul><li><strong>特点</strong>:这也是Python标准库的一部分,提供了一个轻量级的DOM(Document Object Model)实现。DOM解析器会将整个XML文档加载到内存中,并构建一个完整的树形结构,然后你可以通过这个树来导航和操作。</li><li><strong>功能</strong>:它提供了符合W3C DOM标准的API,这使得它在某些方面比ElementTree更“规范”,比如它区分元素节点、文本节点、属性节点等。它的API通常比较冗长,需要更多的代码来完成相同的任务。</li><li><strong>适用场景</strong>:如果你需要严格遵循DOM模型,或者XML文档不是特别大,并且你习惯于DOM风格的API。不过,在大多数情况下,ElementTree的简洁性往往更受欢迎。</li></ul></li><li><p><strong>xml.sax</strong>:</p><ul><li><strong>特点</strong>:SAX(Simple API for XML)是一个事件驱动的解析器。与DOM和ElementTree不同,SAX不会构建整个XML文档的内存表示。它在解析过程中,当遇到XML文档中的特定事件(如开始标签、结束标签、文本内容)时,会调用你提供的回调函数。</li><li>**</li></ul></li></ol></p> </div> <span class="article_notice">本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com</span> <div class="article_otherarticle"> <span>作者最新文章</span> <div> <div class="otherarticles"> <a href="/news/774727" title="coreldraw快捷键怎么设置在哪里"><span>coreldraw快捷键怎么设置在哪里</span></a> <span>2026-11-02 21:39</span> </div> <div class="otherarticles"> <a href="/news/456345" title="AO3最新可用链接及中文入口汇总"><span>AO3最新可用链接及中文入口汇总</span></a> <span>2026-10-29 13:32</span> </div> <div class="otherarticles"> <a href="/news/773254" title="coreldraw怎么插入图片 图片导入步骤"><span>coreldraw怎么插入图片 图片导入步骤</span></a> <span>2026-10-27 15:37</span> </div> <div class="otherarticles"> <a href="/news/772656" title="coreldraw快捷键冲突 怎么改 自定义按键解决"><span>coreldraw快捷键冲突 怎么改 自定义按键解决</span></a> <span>2026-10-24 08:50</span> </div> <div class="otherarticles"> <a href="/news/770891" title="AO3中文界面设置指南与核心功能使用教程"><span>AO3中文界面设置指南与核心功能使用教程</span></a> <span>2026-10-14 23:28</span> </div> </div> </div> <div class="article_card_class"> <a href="/newslist/313_1" title="编程开发">编程开发</a> </div> <div class="article_nearby"> <div> <span>上一篇:</span> <a href="/news/454861" title="抖音私信被封如何申诉?被误举报怎么解封?" class="woh">抖音私信被封如何申诉?被误举报怎么解封?</a> </div> <div> <span>下一篇:</span> <a href="/news/454868" title="刺客信条病毒预防技巧全解析" class="woh">刺客信条病毒预防技巧全解析</a> </div> </div> <div class="article_related"> <div class="index_title flexBox"> <span>相关文章</span> <a href="/newslist/1" title="更多">更多</a> </div> <div class="article_listLMs"> <div class="index_article flexBox articlebox"> <a href="/news/775473" title="GitHub六个AI开源项目能做什么?软件理解、语音与求职场景" class="index_article_img"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/tit/articles/47/20261105/eb5a8195fdf2a9c8b67de684b7040398ae028abb2746964d03eeb0de1f52bbea.webp" src="/static/images/moren.png" alt="GitHub六个AI开源项目能做什么?软件理解、语音与求职场景" class="oimg" /></a> <div> <a href="/news/775473" title="GitHub六个AI开源项目能做什么?软件理解、语音与求职场景" class="index_article_title woh">GitHub六个AI开源项目能做什么?软件理解、语音与求职场景</a> <p class="woh">解析六个GitHub AI开源项目的具体用途,包括软件静态分析、智能体回答检查、多语言配音、求职材料生成、本地代码检索及动态歌词展示,帮助开发者根据实际需求筛选工具并正确验证结果。</p> <div class="index_article_info"> <div class="index_article_infos"> <span class="index_article_time">2026-11-05</span> <span class="index_article_times">0</span> <span class="index_article_author">SoftVibe</span> </div> <div class="index_article_class"> <a href="/newslist/9647_1" title="GitHub">GitHub</a> </div> </div> </div> </div> <div class="index_article flexBox articlebox"> <a href="/news/775435" title="opencode安装skills教程及本地配置方法" class="index_article_img"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/tit/articles/47/20261105/4642fda9386c5d5ca520bf61a6c2198b7b329aa9d69ac4ebcf11a3879cd90a83.webp" src="/static/images/moren.png" alt="opencode安装skills教程及本地配置方法" class="oimg" /></a> <div> <a href="/news/775435" title="opencode安装skills教程及本地配置方法" class="index_article_title woh">opencode安装skills教程及本地配置方法</a> <p class="woh">遇到OpenCode Skills无法加载或配置无效?本文手把手教你完成Skills的安装、环境变量设置及本地调试,避开常见坑点,让AI助手更懂你的代码习惯。</p> <div class="index_article_info"> <div class="index_article_infos"> <span class="index_article_time">2026-11-05</span> <span class="index_article_times">0</span> <span class="index_article_author">花朝朝暮</span> </div> <div class="index_article_class"> <a href="/newslist/31762_1" title="AI编程助手">AI编程助手</a> <a href="/newslist/141945_1" title="插件管理">插件管理</a> </div> </div> </div> </div> <div class="index_article flexBox articlebox"> <a href="/news/775354" title="如何开启Visual Studio2022实时代码分析警告提示" class="index_article_img"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/tit/articles/47/20261105/bb17ecaa18603c45882bbb8003a919e92173770187500b11cf5ddf753fbdeb07.webp" src="/static/images/moren.png" alt="如何开启Visual Studio2022实时代码分析警告提示" class="oimg" /></a> <div> <a href="/news/775354" title="如何开启Visual Studio2022实时代码分析警告提示" class="index_article_title woh">如何开启Visual Studio2022实时代码分析警告提示</a> <p class="woh">解决 Visual Studio 2022 编辑时不显示代码分析警告的问题。指南涵盖 .NET 项目实时分析设置、Roslyn 分析器范围调整及错误列表来源筛选,确保开发者能高效利用实时代码诊断功能。</p> <div class="index_article_info"> <div class="index_article_infos"> <span class="index_article_time">2026-11-05</span> <span class="index_article_times">0</span> <span class="index_article_author">TrueRain</span> </div> <div class="index_article_class"> <a href="/newslist/147379_1" title="VisualStudio怎么用">VisualStudio怎么用</a> </div> </div> </div> </div> <div class="index_article flexBox articlebox"> <a href="/news/775327" title="如何在Visual Studio2022查看变量监视窗口调试程序" class="index_article_img"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/tit/articles/47/20261105/e1f7cc609ef52abfbe98b8a80b73c7a695d63f254b5631e1fd4589c12f465162.webp" src="/static/images/moren.png" alt="如何在Visual Studio2022查看变量监视窗口调试程序" class="oimg" /></a> <div> <a href="/news/775327" title="如何在Visual Studio2022查看变量监视窗口调试程序" class="index_article_title woh">如何在Visual Studio2022查看变量监视窗口调试程序</a> <p class="woh">详解 Visual Studio 2022 调试技巧:包括断点设置、监视窗口开启方法、变量添加步骤以及通过 F10 单步执行观察变量值变化的全过程。</p> <div class="index_article_info"> <div class="index_article_infos"> <span class="index_article_time">2026-11-05</span> <span class="index_article_times">0</span> <span class="index_article_author">Stella</span> </div> <div class="index_article_class"> <a href="/newslist/147379_1" title="VisualStudio怎么用">VisualStudio怎么用</a> </div> </div> </div> </div> <div class="index_article flexBox articlebox"> <a href="/news/775326" title="Visual Studio2017设置默认编码为UTF-8不带BOM" class="index_article_img"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/tit/articles/47/20261105/9eeb5790cb2504fb671724a9242f110a6cf15c6dca82095c5be805f62e2b8ef1.webp" src="/static/images/moren.png" alt="Visual Studio2017设置默认编码为UTF-8不带BOM" class="oimg" /></a> <div> <a href="/news/775326" title="Visual Studio2017设置默认编码为UTF-8不带BOM" class="index_article_title woh">Visual Studio2017设置默认编码为UTF-8不带BOM</a> <p class="woh">针对 Visual Studio 2017 缺乏全局默认编码选项的情况,详解如何利用 .editorconfig 设定项目级 UTF-8 无 BOM 规则,以及手动转换现有文件并校验字节的方法。</p> <div class="index_article_info"> <div class="index_article_infos"> <span class="index_article_time">2026-11-05</span> <span class="index_article_times">0</span> <span class="index_article_author">CityMoon</span> </div> <div class="index_article_class"> <a href="/newslist/147379_1" title="VisualStudio怎么用">VisualStudio怎么用</a> </div> </div> </div> </div> <div class="index_article flexBox articlebox"> <a href="/news/775325" title="Visual Studio2022F5调试提示启动项目未配置怎么修复" class="index_article_img"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/tit/articles/47/20261105/38b786fdb24dfbdcd113dce1db9facb54b2644353fd79b3b2d4e503c5e5a79f4.webp" src="/static/images/moren.png" alt="Visual Studio2022F5调试提示启动项目未配置怎么修复" class="oimg" /></a> <div> <a href="/news/775325" title="Visual Studio2022F5调试提示启动项目未配置怎么修复" class="index_article_title woh">Visual Studio2022F5调试提示启动项目未配置怎么修复</a> <p class="woh">解决 Visual Studio 2022 F5 调试报错问题,通过设置启动项目、检查解决方案属性及正确区分类库与应用项目,快速恢复调试功能。</p> <div class="index_article_info"> <div class="index_article_infos"> <span class="index_article_time">2026-11-05</span> <span class="index_article_times">0</span> <span class="index_article_author">OceanRain</span> </div> <div class="index_article_class"> <a href="/newslist/147379_1" title="VisualStudio怎么用">VisualStudio怎么用</a> </div> </div> </div> </div> <div class="index_article flexBox articlebox"> <a href="/news/775324" title="Visual Studio2022NuGet包还原失败离线处理方案" class="index_article_img"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/tit/articles/47/20261105/7c5513aa564bdf61fb562e1d89e876d3ab911ca31df76d1ac4ec18bc0748c0b4.webp" src="/static/images/moren.png" alt="Visual Studio2022NuGet包还原失败离线处理方案" class="oimg" /></a> <div> <a href="/news/775324" title="Visual Studio2022NuGet包还原失败离线处理方案" class="index_article_title woh">Visual Studio2022NuGet包还原失败离线处理方案</a> <p class="woh">解决Visual Studio 2022离线环境中NuGet包还原失败的难题,涵盖依赖链分析、本地源配置、包集收集及隔离验证步骤,帮助开发者构建稳定的离线开发环境。</p> <div class="index_article_info"> <div class="index_article_infos"> <span class="index_article_time">2026-11-05</span> <span class="index_article_times">0</span> <span class="index_article_author">见山小星星</span> </div> <div class="index_article_class"> <a href="/newslist/147379_1" title="VisualStudio怎么用">VisualStudio怎么用</a> </div> </div> </div> </div> <div class="index_article flexBox articlebox"> <a href="/news/775323" title="Visual Studio2017大项目加载缓慢,优化加载性能技巧" class="index_article_img"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/tit/articles/47/20261105/1d9079643345d11cf313fe2df8fa90fcbe862bb5c962196c5a172e20cf668d0b.webp" src="/static/images/moren.png" alt="Visual Studio2017大项目加载缓慢,优化加载性能技巧" class="oimg" /></a> <div> <a href="/news/775323" title="Visual Studio2017大项目加载缓慢,优化加载性能技巧" class="index_article_title woh">Visual Studio2017大项目加载缓慢,优化加载性能技巧</a> <p class="woh">解决Visual Studio 2017大型项目加载慢的实用指南。涵盖性能监测、扩展管理、文档恢复优化及版本兼容性检查,帮助开发者精准定位瓶颈并提升工作效率。</p> <div class="index_article_info"> <div class="index_article_infos"> <span class="index_article_time">2026-11-05</span> <span class="index_article_times">0</span> <span class="index_article_author">梦初醒初夏</span> </div> <div class="index_article_class"> <a href="/newslist/147379_1" title="VisualStudio怎么用">VisualStudio怎么用</a> </div> </div> </div> </div> <div class="index_article flexBox articlebox"> <a href="/news/775321" title="Visual Studio2022设置多启动项目同时调试运行" class="index_article_img"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/tit/articles/47/20261105/d110c1917b2812b0e020e8c6a6c45f989e5491a41a0bf7b2a67c58ad14c38fff.webp" src="/static/images/moren.png" alt="Visual Studio2022设置多启动项目同时调试运行" class="oimg" /></a> <div> <a href="/news/775321" title="Visual Studio2022设置多启动项目同时调试运行" class="index_article_title woh">Visual Studio2022设置多启动项目同时调试运行</a> <p class="woh">详解 Visual Studio 2022 多启动项目配置方法,包括启动动作选择、顺序调整及调试技巧,帮助开发者高效调试分布式或前后端分离应用。</p> <div class="index_article_info"> <div class="index_article_infos"> <span class="index_article_time">2026-11-05</span> <span class="index_article_times">1</span> <span class="index_article_author">知南</span> </div> <div class="index_article_class"> <a href="/newslist/147379_1" title="VisualStudio怎么用">VisualStudio怎么用</a> </div> </div> </div> </div> <div class="index_article flexBox articlebox"> <a href="/news/775298" title="fastapi下载文件接口实现教程" class="index_article_img"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/tit/articles/47/20261105/c67f51ba9a062018223dccadd037f612bcef350c1a7baeae97b12e64197cd7c7.webp" src="/static/images/moren.png" alt="fastapi下载文件接口实现教程" class="oimg" /></a> <div> <a href="/news/775298" title="fastapi下载文件接口实现教程" class="index_article_title woh">fastapi下载文件接口实现教程</a> <p class="woh">深入解析在FastAPI框架中实现文件下载接口的完整方案,涵盖基于FileResponse的本地静态文件传输、基于StreamingResponse的分块流式传输、RFC 5987中文文件名编码规范、路径穿越安全防御及BackgroundTasks临时文件清理,并配备详细代码示例与架构解析图。</p> <div class="index_article_info"> <div class="index_article_infos"> <span class="index_article_time">2026-11-05</span> <span class="index_article_times">0</span> <span class="index_article_author">听风</span> </div> <div class="index_article_class"> <a href="/newslist/5624_1" title="文件下载">文件下载</a> <a href="/newslist/16269_1" title="FastAPI">FastAPI</a> <a href="/newslist/101759_1" title="python教程">python教程</a> </div> </div> </div> </div> </div> <a href="/newslist/1" title="查看更多" class="index_more">查看更多</a> </div> </div> <div class="article_listR"> <div class="indexMain4R1"> <div class="index_title flexBox"> <span>热门文章</span> <a href="/newslist/1" title="更多">更多</a> </div> <div class="indexMain4R1M"> <a href="/news/768676" title="Photoshop蒙版换证件照背景颜色怎么改?实用操作步骤详解" class=""><span class="woh">Photoshop蒙版换证件照背景颜色怎么改?实用操作步骤详解</span></a> <a href="/news/767686" title="AutoCAD绘制机械零件三维实体详细教程" class=""><span class="woh">AutoCAD绘制机械零件三维实体详细教程</span></a> <a href="/news/767677" title="AE教程书籍挑选指南:零基础、动效与合成方向实战标准" class=""><span class="woh">AE教程书籍挑选指南:零基础、动效与合成方向实战标准</span></a> <a href="/news/768677" title="Photoshop图层合并快捷键是什么?合并 盖印及分开图层方法" class=""><span class="woh">Photoshop图层合并快捷键是什么?合并 盖印及分开图层方法</span></a> <a href="/news/768672" title="Photoshop日系调色教程:小清新风格参数与思路" class=""><span class="woh">Photoshop日系调色教程:小清新风格参数与思路</span></a> </div> </div> <div class="indexMain4R2"> <div class="index_title flexBox"> <span>精品专题</span> <a href="/newslist/tag_1" title="更多">更多</a> </div> <div class="indexMain4R2M"> <div class="indexMain4R2Ms"> <a href="/newslist/141356_1" title="装机必备"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/uploads/20260916/23a0ca69dd790f4a338bf469823181a8.webp" src="/static/images/moren.png" alt="装机必备" class="oimg" /></a> <div> <a href="/newslist/141356_1" title="装机必备" class="woh">装机必备</a> <p class="poh">正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。</p> </div> </div> <div class="indexMain4R2Ms"> <a href="/newslist/2909_1" title="Windows"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/uploads/20260916/7a276fc2f6c50e3d02985b5c5b8c3791.webp" src="/static/images/moren.png" alt="Windows" class="oimg" /></a> <div> <a href="/newslist/2909_1" title="Windows" class="woh">Windows</a> <p class="poh">正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。</p> </div> </div> <div class="indexMain4R2Ms"> <a href="/newslist/340_1" title="PDF教程"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='/static/images/moren.png'" data-src="https://img.zhengruan.com/uploads/20261014/01cbb54aae81565030b33be4b5b52f5d.webp" src="/static/images/moren.png" alt="PDF教程" class="oimg" /></a> <div> <a href="/newslist/340_1" title="PDF教程" class="woh">PDF教程</a> <p class="poh">正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。</p> </div> </div> </div> </div> <div class="right_list1"> <div class="index_title flexBox"> <span>Mac软件</span> <a href="/newslist/3169_1" title="更多">更多</a> </div> <div class="right_list1M"> <div class="right_list1s"> <a href="/news/771275" title="讯飞智作 网页版"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='./static/images/moren.png'" data-src="https://img.zhengruan.com/uploads/20261020/6ba0a0b96eeb1426c34c4cdc02b9f397.webp" src="/static/images/moren.png" alt="讯飞智作 网页版" class="oimg" /></a> <div> <a href="/news/771275" title="讯飞智作 网页版" class="right_list1s_title woh">讯飞智作 网页版</a> <div> <span>Windows/ macOS/ Linux</span> </div> <p class="woh">讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。</p> </div> </div> <div class="right_list1s"> <a href="/news/771272" title="火山引擎 网页版"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='./static/images/moren.png'" data-src="https://img.zhengruan.com/uploads/20261020/8a197278b907a5b2467f2261bef018b6.webp" src="/static/images/moren.png" alt="火山引擎 网页版" class="oimg" /></a> <div> <a href="/news/771272" title="火山引擎 网页版" class="right_list1s_title woh">火山引擎 网页版</a> <div> <span>Windows/ macOS/ Linux</span> </div> <p class="woh">火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。</p> </div> </div> <div class="right_list1s"> <a href="/news/772358" title="Aperty macOS版"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='./static/images/moren.png'" data-src="https://img.zhengruan.com/uploads/20261022/17c02a320623e1d004b001165ae00fce.webp" src="/static/images/moren.png" alt="Aperty macOS版" class="oimg" /></a> <div> <a href="/news/772358" title="Aperty macOS版" class="right_list1s_title woh">Aperty macOS版</a> <div> <span>macOS</span> </div> <p class="woh">Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。</p> </div> </div> </div> </div> <div class="right_list1"> <div class="index_title flexBox"> <span>WINDOWS</span> <a href="/newslist/2909_1" title="更多">更多</a> </div> <div class="right_list1M"> <div class="right_list1s"> <a href="/news/771275" title="讯飞智作 网页版"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='./static/images/moren.png'" data-src="https://img.zhengruan.com/uploads/20261020/6ba0a0b96eeb1426c34c4cdc02b9f397.webp" src="/static/images/moren.png" alt="讯飞智作 网页版" class="oimg" /></a> <div> <a href="/news/771275" title="讯飞智作 网页版" class="right_list1s_title woh">讯飞智作 网页版</a> <div> <span>Windows/ macOS/ Linux</span> </div> <p class="woh">讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。</p> </div> </div> <div class="right_list1s"> <a href="/news/771272" title="火山引擎 网页版"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='./static/images/moren.png'" data-src="https://img.zhengruan.com/uploads/20261020/8a197278b907a5b2467f2261bef018b6.webp" src="/static/images/moren.png" alt="火山引擎 网页版" class="oimg" /></a> <div> <a href="/news/771272" title="火山引擎 网页版" class="right_list1s_title woh">火山引擎 网页版</a> <div> <span>Windows/ macOS/ Linux</span> </div> <p class="woh">火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。</p> </div> </div> <div class="right_list1s"> <a href="/news/770538" title="PixTV 网页版"><img data-lazy-img loading="lazy" decoding="async" onerror="this.onerror=null;this.src='./static/images/moren.png'" data-src="https://img.zhengruan.com/uploads/20261013/25f12acab7737a8473a912699ce14220.webp" src="/static/images/moren.png" alt="PixTV 网页版" class="oimg" /></a> <div> <a href="/news/770538" title="PixTV 网页版" class="right_list1s_title woh">PixTV 网页版</a> <div> <span>Windows</span> </div> <p class="woh">PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。</p> </div> </div> </div> </div> <div class="articlelist_main1R2"> <div class="index2_title"> <h2>PDF<span>工具</span></h2> <a title="更多" rel="nofollow" target="_blank" href="https://www.pdf.cn"> <span>更多</span> <b></b> </a> </div> <div class="articlelist_main1R2M"> <a title="PDF合并" href="https://www.pdf.cn/merge-pdf" target="_blank"> <img src="/static/images/header_Ms_hides11.png" alt="PDF合并" /> <span>PDF合并</span> </a> <a title="PDF转换至PDF/A" href="https://www.pdf.cn/pdf-to-pdfa" target="_blank"> <img src="/static/images/header_Ms_hides10.png" alt="PDF转换至PDF/A" /> <span>PDF转PDF/A</span> </a> <a title="PDF转PPT" href="https://www.pdf.cn/pdf-to-ppt" target="_blank"> <img src="/static/images/header_Ms_hides7.png" alt="PDF转PPT" /> <span>PDF转PPT</span> </a> <a title="HTML转PDF" href="https://www.pdf.cn/html-to-pdf" target="_blank"> <img src="/static/images/header_Ms_hides5.png" alt="HTML转PDF" /> <span>HTML转PDF </span> </a> <a title="PDF删除页面" href="https://www.pdf.cn/delete-pdf" target="_blank"> <img src="/static/images/header_Ms_hides13.png" alt="PDF删除页面" /> <span>PDF删除页面</span> </a> <a title="Excel转PDF" href="https://www.pdf.cn/excel-to-pdf" target="_blank"> <img src="/static/images/header_Ms_hides3.png" alt="Excel转PDF" /> <span>EXCEL转PDF</span> </a> <a title="PDF转XML" href="https://www.pdf.cn/pdf-to-xml" target="_blank"> <img src="/static/images/header_Ms_hides14.png" alt="PDF转XML" /> <span>PDF转XML</span> </a> <a title="排列PDF文件" href="https://www.pdf.cn/organize-pdf" target="_blank"> <img src="/static/images/header_Ms_hides15.png" alt="排列PDF文件" /> <span>排列PDF页面</span> </a> <a title="图片转PDF" href="https://www.pdf.cn/images-to-pdf" target="_blank"> <img src="/static/images/header_Ms_hides4.png" alt="图片转PDF" /> <span>图片转PDF</span> </a> <a title="PDF转Excel" href="https://www.pdf.cn/pdf-to-excel" target="_blank"> <img src="/static/images/header_Ms_hides8.png" alt="PDF转Excel" /> <span>PDF转EXCEL</span> </a> <a title="编辑PDF" href="https://www.pdf.cn/pdf/" target="_blank"> <img src="/static/images/header_Ms_hides24.png" alt="编辑PDF" /> <span>编辑PDF</span> </a> <a title="Word转PDF" href="https://www.pdf.cn/word-to-pdf" target="_blank"> <img src="/static/images/header_Ms_hides1.png" alt="Word转PDF" /> <span>word转PDF</span> </a> </div> </div> </div> </div> </div> </main> <footer> <div class="footer1"> <span>为什么要购买正版软件?</span> <div class=""> <div> <b>01</b> <span>官方授权</span> <p>授权来源透明,订单与许可信息可随时查询。</p> </div> <span></span> <div> <b>02</b> <span>即时交付</span> <p>付款成功后自动发放激活信息,支持订单追踪。</p> </div> <span></span> <div> <b>03</b> <span>中文协助 </span> <p>安装、激活、迁移与续费问题都有专人响应。</p> </div> <span></span> <div> <b>04</b> <span>长期可用</span> <p>提供升级提醒与授权管理,换机时也能轻松迁移。</p> </div> </div> </div> <div class="footer2"> <p>网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com <a href="/sitemap.xml">网站地图</a></p> <p>Copyright ©2018-2026</p> </div> </footer> <!--底部 end--> <script> var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?3835539565b311d85319cd21da8fd0d9"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <!-- Matomo --> <script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function () { var u = "https://tongji.php.cn/"; _paq.push(['setTrackerUrl', u + 'matomo.php']); _paq.push(['setSiteId', '36']); var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0]; g.async = true; g.src = u + 'matomo.js'; s.parentNode.insertBefore(g, s); })(); </script> <!-- End Matomo Code --> </body> <script src="/static/layui/layui.all.js"></script> <script src="/static/swiper/swiper-bundle.min.js"></script> <script src="/static/js/common.js?2.4"></script> <script> const sourceToken = 'QZjJ0W-D3MsGQJ8_ySXem6GHJYJdyECIDHccSy6SeQA'; (async () => { try { await fetch('/logs', { method: 'GET', headers: { 'sourceToken': sourceToken } }); console.log('Thanks'); } catch (error) { console.error('Error:', error); } })(); </script> </html>