最近這個問題一直困擾着我,我似乎無法找到一個可能的解決方案。我如何使用DOM轉義特殊字符
我正在處理一個Web服務器,它接收一個XML文檔來做一些處理。服務器的解析器有問題&,',「,<,>我知道這是不好的,我沒有在該服務器上實現xml解析器,但在等待補丁之前,我需要繞過。 ,在將我的XML文檔上傳到此服務器之前,我需要解析它並轉義xml特殊字符。我現在使用的是DOM。問題是,如果我遍歷TEXT_NODES並用它們的轉義版本替換所有特殊字符,我保存這個文件,
爲d'ex
我得到d&apos;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();
}
maybe' <![CDATA ['?我認爲你應該發佈你的轉義代碼。 –
@RC。我添加了代碼:) – Undisputed007