문제

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");

그러나 그 중 어느 것도 도움이되지 않습니다. 누구든지 제안이 있습니까? 왜냐하면:

&#9;&#9;&#9;&#9;&#9;<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)으로 문자열을 읽고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top