0

0

在上传的XML文件中查找和替换内容 Java/Python脚本

煙雲

煙雲

发布时间:2026-01-29 07:53:10

|

788人浏览过

|

来源于php中文网

原创

应使用 xml.etree.ElementTree 解析后修改文本和属性值,避免字符串替换破坏结构;遍历用 tree.iter(),修改后调用 tree.write() 保存,注意编码和声明。

在上传的xml文件中查找和替换内容 java/python脚本

用 Python 的 xml.etree.ElementTree 安全修改 XML 内容

直接字符串替换 XML 文件极大概率破坏结构(比如改了标签名、属性值里含 或引号),必须用解析器。Python 标准库xml.etree.ElementTree 足够处理大多数非 DTD/命名空间复杂的场景。

关键点:它不保留原始格式(缩进、换行、注释),若需格式化输出,得手动加 xml.dom.minidom 或第三方库;另外它默认不解析 DTD,遇到 会报错,需提前清理或换用 lxml

  • 只替换文本内容(elem.text)或属性值(elem.attrib[key]),不碰标签名和结构
  • 遍历用 tree.iter(),比 findall() 更稳妥,能覆盖嵌套任意深度的元素
  • 修改后调用 tree.write(..., encoding='utf-8', xml_declaration=True),避免写入乱码
import xml.etree.ElementTree as ET

def replace_in_xml(file_path, old_text, new_text):
    tree = ET.parse(file_path)
    root = tree.getroot()
    for elem in root.iter():
        if elem.text and old_text in elem.text:
            elem.text = elem.text.replace(old_text, new_text)
        for key, val in elem.attrib.items():
            if old_text in val:
                elem.attrib[key] = val.replace(old_text, new_text)
    tree.write(file_path, encoding='utf-8', xml_declaration=True)

replace_in_xml('config.xml', 'DEV_SERVER', 'PROD_SERVER')

Java 中用 DocumentBuilder 替换节点文本和属性

Java 原生方案依赖 javax.xml.parsers.DocumentBuilder,比 Python 略繁琐,但可控性更强。注意它默认不忽略空白文本节点,elem.getTextContent() 会连带换行和缩进一起返回,直接替换可能污染格式。

常见错误:用 setTextContent() 覆盖整个节点内容,误删子元素;或没设置 DocumentBuilderFactory.setIgnoringElementContentWhitespace(true),导致遍历时多出无意义的 #text 节点。

立即学习Java免费学习笔记(深入)”;

XPaper Ai
XPaper Ai

AI撰写论文、开题报告生成、AI论文生成器尽在XPaper Ai论文写作辅助指导平台

下载
  • 只对 Node.ELEMENT_NODE 类型调用 getTextContent()setTextContent()
  • 属性替换用 elem.setAttribute(attrName, newValue),别用 setAttributeNode()
  • 写回文件必须用 Transformer,且设 setOutputProperty(OutputKeys.INDENT, "yes") 才有缩进
import javax.xml.parsers.*;
import org.w3c.dom.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;

public class XmlReplacer {
    public static void replaceText(String filePath, String oldStr, String newStr) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setIgnoringElementContentWhitespace(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(new File(filePath));

        NodeList allNodes = doc.getElementsByTagName("*");
        for (int i = 0; i < allNodes.getLength(); i++) {
            Node node = allNodes.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element elem = (Element) node;
                if (elem.getTextContent() != null && elem.getTextContent().contains(oldStr)) {
                    elem.setTextContent(elem.getTextContent().replace(oldStr, newStr));
                }
                NamedNodeMap attrs = elem.getAttributes();
                for (int j = 0; j < attrs.getLength(); j++) {
                    Node attr = attrs.item(j);
                    if (attr.getNodeValue().contains(oldStr)) {
                        attr.setNodeValue(attr.getNodeValue().replace(oldStr, newStr));
                    }
                }
            }
        }

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        t.setOutputProperty(OutputKeys.INDENT, "yes");
        t.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(filePath)));
    }
}

处理含命名空间或 CDATA 的 XML 文件

ElementTree 默认不支持命名空间前缀匹配,写 find('.//ns:tag') 会失败;CDATA 块在解析后变成普通文本,但若原始 XML 里是 ,直接改 elem.text 不会影响其 CDATA 标识——也就是说,你改完保存时,CDATA 会退化成普通文本,再读取就丢失语义。

  • 命名空间:注册前缀,如 ET.register_namespace('ns', 'http://example.com/ns'),查找时用完整 URI 字典:root.find('.//{http://example.com/ns}item')
  • CDATA:标准库无法识别/保留 CDATA,必须换 lxml.etree,用 etree.CDATA(text) 显式包裹新内容
  • 特殊字符(&, ):解析后已转义为实体,替换时按转义后形式操作,比如把 zuojiankuohaophpcn 换成 youjiankuohaophpcn

Shell + sed / xmlstar 快速批量替换(仅限简单场景)

如果 XML 非常规整、无嵌套同名标签、无属性值含目标字符串,且你只要“快”,不用强一致性,sed -i 是最快的。但一旦结构稍复杂,sed 就会误伤——比如把 DEV_SERVERhttps://DEV_SERVER/api 一起替换了,而后者本不该动。

更靠谱的轻量方案是 xmlstar(需单独安装),它支持 XPath,能精准定位节点:

  • xmlstar --inplace -u "//server/name" -v "PROD_SERVER" config.xml → 只改 元素文本
  • xmlstar --inplace -u "//*[@env='dev']/@env" -v "prod" config.xml → 只改 env="dev" 属性
  • 不支持正则替换,只能整值替换;若要部分替换(如 URL 中的 host),仍得先用 xmlstar 提取,再用 sed 处理,最后写回

真正需要可靠、可维护、可复用的替换逻辑,还是回到 Python 或 Java 解析器。临时救急才用命令行工具

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1900

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2091

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1068

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1501

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

633

2024.03.22

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

2

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号