Java:xml字符转义

在Java中,在处理XML时,经常会遇到需要将特殊字符转义的情况,以避免XML解析错误或数据不正确显示的问题。例如,在XML中,`<`、`>`、`&`、`"` 和 `'` 这些字符需要被转义。下面是一些常见的转义规则和在Java中如何实现的方法。

  1. 手动转义

可以手动将这些字符替换为它们的XML转义形式:

  • `<` 替换为 `&lt;`

  • `>` 替换为 `&gt;`

  • `&` 替换为 `&amp;`

  • `"` 替换为 `&quot;`

  • `'` 替换为 `'`(在某些情况下使用,但不是所有XML解析器都要求)

示例代码:

public class XmlEscapeUtil {

public static String escapeXml(String xml) {

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

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

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

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

.replace("'", "'"); // 如果需要的话

}

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

String original = "This is a <test> string & contains \"special\" characters.";

String escaped = escapeXml(original);

System.out.println(escaped);

}

}

  1. 使用Apache Commons Text库

Apache Commons Text库提供了一个方便的类`StringEscapeUtils`,可以用来转义XML中的特殊字符:

import org.apache.commons.text.StringEscapeUtils;

public class XmlEscapeUtil {

public static String escapeXml(String xml) {

return StringEscapeUtils.escapeXml10(xml); // 或者 StringEscapeUtils.escapeXml11(xml) 根据XML版本

}

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

String original = "This is a <test> string & contains \"special\" characters.";

String escaped = escapeXml(original);

System.out.println(escaped);

}

}

  1. 使用JAXB或Jackson进行序列化时自动转义

如果你正在使用JAXB或Jackson等库来序列化对象到XML,这些库通常会自动处理特殊字符的转义。例如,使用Jackson时:

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.dataformat.xml.XmlMapper;

import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;

public class XmlSerializationExample {

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

ObjectMapper xmlMapper = new XmlMapper();

xmlMapper.enable(ToXmlGenerator.Feature.WRITE_XML_DECLARATION); // 添加XML声明头(可选)

MyObject obj = new MyObject("Some <value>", "Another & value"); // MyObject是你的Java对象类,包含要序列化的字段。

String xml = xmlMapper.writeValueAsString(obj); // 自动转义特殊字符。

System.out.println(xml);

}

}

```

  1. 使用内置的XML生成器API(如StAX或DOM)时自动转义

如果你正在使用StAX或DOM API来手动构建XML,你也可以使用它们提供的API来创建转义后的文本节点:

import javax.xml.parsers.DocumentBuilderFactory;

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 XmlDomExample {

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);

Text textNode = doc.createTextNode("This is a <test> string & contains \"special\" characters."); // 不自动转义,需要手动转义或使用CDATA区块。

root.appendChild(textNode); // 或者使用CDATA区块: doc.createCDATASection("This is a <test> string & contains \"special\" characters."); 并且附加到root上。

TransformerFactory transformerFactory = TransformerFactory.newInstance();

Transformer transformer