【发布时间】:2016-11-23 09:09:36
【问题描述】:
这个问题最近一直困扰着我,我似乎无法找到可能的解决方案。
我正在处理一个接收 XML 文档以进行一些处理的网络服务器。服务器的解析器有 &,',", 的问题。我知道这很糟糕,我没有在该服务器上实现 xml 解析器。但是在等待补丁之前我需要绕过。
现在,在将我的 XML 文档上传到此服务器之前,我需要对其进行解析并转义 xml 特殊字符。我目前正在使用 DOM。问题是,如果我遍历 TEXT_NODES 并将所有特殊字符替换为其转义版本,当我保存此文档时,
对于d'ex,我得到d'ex,但我需要d'ex
这是有道理的,因为 DOM 转义了“&”。但显然这不是我需要的。
因此,如果 DOM 已经能够将"&" 转义为"&",我该如何让它转义其他字符,例如" 到"?
如果不能,我如何将已经解析和转义的文本保存在它的节点中,而不必在保存时重新转义它们?
这就是我转义我使用 apache StringEscapeUtils 类的特殊字符的方式:
public String xMLTransform() throws Exception
{
String xmlfile = FileUtils.readFileToString(new File(filepath));
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new InputSource(new StringReader(xmlfile.trim().replaceFirst("^([\\W]+)<", "<"))));
NodeList nodeList = doc.getElementsByTagName("*");
for (int i = 0; i < nodeList.getLength(); i++) {
Node currentNode = nodeList.item(i);
if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
Node child = currentNode.getFirstChild();
while(child != null) {
if (child.getNodeType() == Node.TEXT_NODE) {
child.setNodeValue(StringEscapeUtils.escapeXml10(child.getNodeValue()));
//Escaping works here. But when saving the final document, the "&" used in escaping gets escaped as well by DOM.
}
child = child.getNextSibling();
}
}
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
transformer.transform(source, result);
FileOutputStream fop = null;
File file;
file = File.createTempFile("escapedXML"+UUID.randomUUID(), ".xml");
fop = new FileOutputStream(file);
String xmlString = writer.toString();
byte[] contentInBytes = xmlString.getBytes();
fop.write(contentInBytes);
fop.flush();
fop.close();
return file.getPath();
}
【问题讨论】:
-
也许
<![CDATA[?我认为你应该发布你的转义代码。 -
@RC。我添加了代码:)
标签: java xml dom xml-parsing domdocument