Java:XML转义

在 Java 中处理 XML,特别是涉及到读取或写入 XML 数据的场景时,经常会遇到需要对 XML 内容进行编码或解码的情况。特别是在涉及到 XML 元素的文本内容(InnerText)时,自动转义(或称为字符实体引用)是非常重要的,以防止 XML 解析错误或安全漏洞,比如 XML 注入攻击。

1. XML 内容的自动转义

在 Java 中,当需要将字符串写入 XML 文件时,通常需要确保这些字符串中的特殊字符被正确地转义。例如,<, >, &, "' 这些字符在 XML 中有特殊的含义,因此它们需要被转换成相应的实体引用(如 &lt;, &gt;, &amp;, &quot;, 和 ')。

2. 使用 Java 标准库处理 XML

使用 org.w3c.dom

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.transform.OutputKeys;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

public class XmlExample {

public static void main(String\[\] args) throws Exception {

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.newDocument();

Element root = doc.createElement("root");

doc.appendChild(root);

Element element = doc.createElement("element");

root.appendChild(element);

// 使用 Text 节点添加内容,并自动转义特殊字符

element.appendChild(doc.createTextNode("<example> & text"));

TransformerFactory transformerFactory = TransformerFactory.newInstance();

Transformer transformer = transformerFactory.newTransformer();

transformer.setOutputProperty(OutputKeys.INDENT, "yes");

DOMSource source = new DOMSource(doc);

StreamResult result = new StreamResult(System.out);

transformer.transform(source, result);

}

}

使用 javax.xml.bind (JAXB)

如果使用 JAXB 来序列化 Java 对象到 XML,JAXB 会自动处理字符的转义

import javax.xml.bind.JAXBContext;

import javax.xml.bind.Marshaller;

public class JAXBExample {

public static void main(String\[\] args) throws Exception {

JAXBContext context = JAXBContext.newInstance(MyObject.class);

Marshaller marshaller = context.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

MyObject obj = new MyObject();

obj.setContent("<example> & text");

marshaller.marshal(obj, System.out);

}

}

3. 手动处理转义和反转义

如果需要手动处理字符串的转义和反转义,可以使用 Apache Commons Text 或手动编写方法:

import org.apache.commons.text.StringEscapeUtils;

public class ManualEscape {

public static void main(String\[\] args) {

String original = "<example> & text";

String escaped = StringEscapeUtils.escapeXml10(original); // Apache Commons Text 库进行转义

System.out.println("Escaped: " + escaped); // 输出: &lt;example&gt; &amp; text

}

}

或者手动实现:

public class ManualEscape {

public static String escapeXml(String input) {

return input.replace("&", "&amp;")

.replace("<", "&lt;")

.replace(">", "&gt;")

.replace("\"", "&quot;")

.replace("'", "'");

}

public static void main(String\[\] args) {

String original = "<example> & text";

String escaped = escapeXml(original); // 手动转义

System.out.println("Escaped: " + escaped); // 输出: &lt;example&gt; &amp; text

}

}

结论

在 Java 中处理 XML 时,确保对特殊字符进行

相关推荐
霸道流氓气质2 分钟前
Spring AI异常处理与重试机制
java·人工智能·spring
郑州光合科技余经理2 小时前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
萧瑟余晖2 小时前
Java深入解析篇三十三之密封类与接口(Sealed Classes)详解
java·开发语言
论迹复利6 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
张宇Joaquin6 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
736c6 小时前
C语言-数组 07
c语言·开发语言
宸津-代码粉碎机7 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_963749108 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
xcLeigh8 小时前
Go入门:整数类型的溢出与安全边界
java·安全·golang
LorryJovens8 小时前
【LAAP科研】CEN因果等价网络理论---从双缝干涉到因果等价
开发语言·php