Эта проблема в последнее время сильно меня подслушивала, и я не могу найти возможное решение.Как я могу избежать специальных символов с помощью DOM
Я имею дело с веб-сервером, который получает XML-документ для обработки. Анализатор сервера имеет проблемы с & ",", <,>. Я знаю, что это плохо, я не выполнил XML-парсер на этом сервере. Но прежде, чем ждет патч мне нужно обойти.
сейчас перед загрузкой моего XML-документа на этот сервер мне нужно проанализировать его и избежать специальных символов xml. В настоящее время я использую DOM. Проблема в том, что если я повторяю TEXT_NODES и заменяет все специальные символы на свои экранированные версии, когда Я сохранить этот документ,
для d'ex
я получаю d&apos;ex
, но мне нужно d'ex
Это имеет смысл, так как, DOM escapes "&". Но, очевидно, это не то, что мне нужно.
Так что, если 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();
}
возможно'
@RC. Я добавил код :) – Undisputed007