Javax 변압기가 공백을 빠져 나가는 것을 어떻게 방지합니까?
-
21-08-2019 - |
문제
javax.xml.transform.transformer 클래스를 사용하여 다음과 같은 XSLT 번역을 수행합니다.
TransformerFactory factory = TransformerFactory.newInstance();
StreamSource source = new StreamSource(TRANSFORMER_PATH);
Transformer transformer = factory.newTransformer(source);
StringWriter extractionWriter = new StringWriter();
String xml = FileUtils.readFileToString(new File(sampleXmlPath));
transformer.transform(new StreamSource(new StringReader(xml)),
new StreamResult(extractionWriter));
System.err.println(extractionWriter.toString());
그러나 내가 무엇을 하든지 변압기가 소스 문서에 있던 탭을 해당 캐릭터 엔티티에 해당하는 것을 피할 수없는 것 같습니다.	
). 나는 둘 다 시도했다 :
transformer.setParameter("encoding", "UTF-8");
그리고:
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
그러나 그 중 어느 것도 도움이되지 않습니다. 누구든지 제안이 있습니까? 왜냐하면:
					<MyElement>
정말 어리석은 것 같습니다 (작동하더라도).
해결책
그래서 이것에 대한 대답은 꽤 절름발이로 판명되었습니다 : Xalan 업데이트. 이전 버전에 무엇이 잘못되었는지 모르겠지만 다음과 같은 최신 버전으로 전환했을 때 : http://xml.apache.org/xalan-j/downloads.html갑자기 탭의 엔티티 에스코핑이 사라졌습니다. 그래도 모든 도움에 감사드립니다.
다른 팁
XMLReader와 함께 saxtransformerFactory를 사용해 볼 수 있습니다.
같은 것 :
SAXTransformerFactory transformFactory = (SAXTransformerFactory) TransformerFactory.newInstance();
StreamSource source = new StreamSource(TRANSFORMER_PATH);
StringWriter extractionWriter = new StringWriter();
TransformerHandler transformerHandler = null;
try {
transformerHandler = transformFactory.newTransformerHandler(source);
transformerHandler.setResult(new StreamResult(extractionWriter));
} catch (TransformerConfigurationException e) {
throw new SAXException("Unable to create transformerHandler due to transformer configuration exception.");
}
XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
reader.setContentHandler(transformerHandler);
reader.parse(new InputSource(new FileReader(xml)));
System.err.println(extractionWriter.toString());
기본적으로 아직 수행하지 않으면 SAX 파서를 무시할 수있는 공백을 포함하지 않도록 설정할 수 있어야합니다. 실제로 이것을 테스트하지는 않았지만 프로젝트 중 하나에서 비슷한 일을합니다.
때로는 이와 같은 것들로, 나중에 Regex로 자신을 교체하는 것은 완전히 나쁜 옵션이 아니기 때문에 나중에 더 나은 옵션을 찾을 때까지 갈 수 있습니다.
파일 스트림을 직접 사용하는 대신 파일을 먼저 문자열로 읽는 이유가 있습니까?
대신에
String xml = FileUtils.readFileToString(new File(sampleXmlPath));
transformer.transform(new StreamSource(new StringReader(xml)),
new StreamResult(extractionWriter));
당신은 시도 할 수 있습니다
transformer.transform(new StreamSource(new FileReader(sampleXmlPath)),
new StreamResult(extractionWriter));
이것은 문제의 원인이 아닐 수도 있지만, 이전에 비슷한 문제를 일으키는 것을 보았습니다. FileUtils.ReadFileToString이 Commons.io 버전 인 경우 UFT-16 (Java 기본값, IIRC)으로 문자열을 읽고 있습니다.