保留数字字符实体字符,例如` ` 在 Java 中解析 XML 时
Keep numeric character entity characters such as ` ` when parsing XML in Java
我正在解析包含数字字符实体字符的 XML,例如(但不限于) < >
(换行符 return < >)在 Java .解析时,我将节点的文本内容附加到 StringBuffer,以便稍后将其写入文本文件。
但是,当我将字符串写入文件或打印出来时,这些 unicode 字符被解析或转换为 newlines/whitespace。
在 Java 中遍历 XML 文件的节点并将文本内容节点存储到字符串时,如何保留原始数字字符实体字符符号?
演示示例 xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<ABCD version="2">
<Field attributeWithChar="A string followed by special symbols " />
</ABCD>
示例 Java 代码。它加载 XML,遍历节点并将每个节点的文本内容收集到 StringBuffer。迭代结束后,它将 StringBuffer 写入控制台,也写入文件(但没有
)符号。
将这些符号存储到字符串时,有什么方法可以保留这些符号?请你帮助我好吗?谢谢。
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException {
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
Document document = null;
DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
document = documentBuilder.parse(new File("path/to/demo.xml"));
StringBuilder sb = new StringBuilder();
NodeList nodeList = document.getElementsByTagName("*");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
NamedNodeMap nnp = node.getAttributes();
for (int j = 0; j < nnp.getLength(); j++) {
sb.append(nnp.item(j).getTextContent());
}
}
}
System.out.println(sb.toString());
try (Writer writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("path/to/demo_output.xml"), "UTF-8"))) {
writer.write(sb.toString());
}
}
在将文件解析为 Document
之前,您需要转义所有 XML 个实体。您可以通过使用相应的 XML 实体 &
转义 ampersand &
本身来做到这一点。像,
DocumentBuilder documentBuilder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
String xmlContents = new String(Files.readAllBytes(Paths.get("demo.xml")), "UTF-8");
Document document = documentBuilder.parse(
new InputSource(new StringReader(xmlContents.replaceAll("&", "&"))
));
输出:
2A string followed by special symbols
P.S。这是 Ravi Thapliyal 回答的补充,而不是替代。
我在处理从 2003 格式的 Excelsheet 导出的 XML 文件时遇到了同样的问题。此 XML 文件将文本内容中的换行符存储为
以及其他数字字符引用。然而,在使用 Java DOM 解析器读取它、处理一些元素的内容并将其转换回 XML 文件之后,我看到所有数字字符引用都被扩展了(即使用 J2SE1.6,换行符在 Windows 中转换为 CRLF
)。由于我的目标是在操作某些元素时尽可能保持内容格式不变(即保留数字字符引用),Ravi Thapliyal 的建议似乎是唯一可行的解决方案。
将XML的内容写回文件时,需要将&
全部替换为&
,对吧?为此,我必须将 StringWriter 作为 StreamResult 提供给转换器并从中获取 String,替换所有字符串并将字符串转储到 xml 文件。
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
DOMSource source = new DOMSource(document);
//write into a stringWriter for further processing.
StringWriter stringWriter = new StringWriter();
StreamResult result = new StreamResult(stringWriter);
t.transform(source, result);
//stringWriter stream contains xml content.
String xmlContent = stringWriter.getBuffer().toString();
//revert "&" back to "&" to retain numeric character references.
xmlContent = xmlContent.replaceAll("&", "&");
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8"));
wr.write(xmlContent);
wr.close();
我正在解析包含数字字符实体字符的 XML,例如(但不限于) < >
(换行符 return < >)在 Java .解析时,我将节点的文本内容附加到 StringBuffer,以便稍后将其写入文本文件。
但是,当我将字符串写入文件或打印出来时,这些 unicode 字符被解析或转换为 newlines/whitespace。
在 Java 中遍历 XML 文件的节点并将文本内容节点存储到字符串时,如何保留原始数字字符实体字符符号?
演示示例 xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<ABCD version="2">
<Field attributeWithChar="A string followed by special symbols " />
</ABCD>
示例 Java 代码。它加载 XML,遍历节点并将每个节点的文本内容收集到 StringBuffer。迭代结束后,它将 StringBuffer 写入控制台,也写入文件(但没有
)符号。
将这些符号存储到字符串时,有什么方法可以保留这些符号?请你帮助我好吗?谢谢。
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException {
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
Document document = null;
DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
document = documentBuilder.parse(new File("path/to/demo.xml"));
StringBuilder sb = new StringBuilder();
NodeList nodeList = document.getElementsByTagName("*");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
NamedNodeMap nnp = node.getAttributes();
for (int j = 0; j < nnp.getLength(); j++) {
sb.append(nnp.item(j).getTextContent());
}
}
}
System.out.println(sb.toString());
try (Writer writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("path/to/demo_output.xml"), "UTF-8"))) {
writer.write(sb.toString());
}
}
在将文件解析为 Document
之前,您需要转义所有 XML 个实体。您可以通过使用相应的 XML 实体 &
转义 ampersand &
本身来做到这一点。像,
DocumentBuilder documentBuilder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
String xmlContents = new String(Files.readAllBytes(Paths.get("demo.xml")), "UTF-8");
Document document = documentBuilder.parse(
new InputSource(new StringReader(xmlContents.replaceAll("&", "&"))
));
输出:
2A string followed by special symbols
P.S。这是 Ravi Thapliyal 回答的补充,而不是替代。
我在处理从 2003 格式的 Excelsheet 导出的 XML 文件时遇到了同样的问题。此 XML 文件将文本内容中的换行符存储为
以及其他数字字符引用。然而,在使用 Java DOM 解析器读取它、处理一些元素的内容并将其转换回 XML 文件之后,我看到所有数字字符引用都被扩展了(即使用 J2SE1.6,换行符在 Windows 中转换为 CRLF
)。由于我的目标是在操作某些元素时尽可能保持内容格式不变(即保留数字字符引用),Ravi Thapliyal 的建议似乎是唯一可行的解决方案。
将XML的内容写回文件时,需要将&
全部替换为&
,对吧?为此,我必须将 StringWriter 作为 StreamResult 提供给转换器并从中获取 String,替换所有字符串并将字符串转储到 xml 文件。
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
DOMSource source = new DOMSource(document);
//write into a stringWriter for further processing.
StringWriter stringWriter = new StringWriter();
StreamResult result = new StreamResult(stringWriter);
t.transform(source, result);
//stringWriter stream contains xml content.
String xmlContent = stringWriter.getBuffer().toString();
//revert "&" back to "&" to retain numeric character references.
xmlContent = xmlContent.replaceAll("&", "&");
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8"));
wr.write(xmlContent);
wr.close();