2010-05-19 3 views
3

XML 문서의 문자를 대체하기위한 깔끔하고 효율적인 방법을 찾고 있습니다. 거의 12,000 개의 UTF-8 문자에 대해 정의 된 대체 테이블이 있으며 대부분은 단일 문자로 대체되지만 일부는 2 ~ 3 문자로 대체해야합니다 (예 : 그리스어 세타는 TH가되어야 함). 문서가 부피가 클 수 있습니다 (100MB 이상). Java로 어떻게 할 것인가? XSLT 사용에 대한 생각이 떠오르지 만 이것이 최선의 선택인지 확실하지 않습니다.Java에서 XML 문서의 문자를 효율적으로 바꾸는 방법은 무엇입니까?

+0

좋은 방법 중 하나는 16 비트 조회 테이블을 만들고 문자 값을 사용하여 성능 조회 및 바꾸기입니다. 이것은 XML 파서가 문자 유효성을 확인하기 위해 수행하는 것입니다. –

+0

@ vtd-xml-author : 그래서 유니 코드 3.0에서만 작동한다는 뜻입니까? 65535 이상의 코드 포인트를 포함하는 UTF-8로 인코딩 된 XML 파일의 경우 어떻게 작동합니까? – SyntaxT3rr0r

+0

좋은 지적. 질문에 따르면, 글자가 "2 자 또는 3 자로 바뀌었다"는 이유로 16 비트 이상으로 올라가지 않을 것으로 보인다. –

답변

3

String.replace (..) 내 경험에 따라 매우 느립니다. 그 API를 사용하여 100MB KML 파일을 파싱하는 데 사용되어 성능이 좋지 않습니다. 그런 다음, Pattern.compile (..)을 사용하여 정규 표현식을 사전 컴파일하고 훨씬 더 빠르게 작업했습니다.

+0

좋은 지적. XML로 처리 할 필요가 없다는 사실에 눈이 멀어서 Java 부분에 대한 최상의 솔루션을 생각하는 것을 완전히 잊어 버렸습니다. –

+0

내가 말했듯이 그 교체는 '바'에 대한 직관적 인 'foo'가 아닙니다. 12.000 대체가 포함 된 큰 매핑 테이블이 정의되어 있습니다. 이 때문에 HashMap 에 매핑을로드 한 다음 XML 태그의 텍스트 콘텐츠의 각 문자를 해당 맵과 비교하여 검사하는 것이 고려되었습니다. 그게 뭐야? –

+0

네, 매핑 테이블이지도 상에 있는지 또는 데이터베이스에 저장하고 Hibernate가 그 캐싱을 처리 할 필요가 있는지 생각해보십시오. 어쩌면 전체 XML을 스캔하여 사전에 영숫자가 아닌 문자를 찾은 다음이 문자 각각에 대해 맵과 대조하여 해당 문자가 존재하는지 확인하고 사전 컴파일 된 정규 표현식을 다시 작성하는 사전 컴파일 된 정규 표현식을 사용할 수 있습니다 그 특정 문자 교체를 수행합니다. 아마도 이것이 최선의 해결책은 아니지만 여기서 아이디어를 던지고 있습니다. – limc

0

지나가는 XML 문서의 각 부분을 볼 수있는 SAX를 살펴보십시오. 그런 다음 텍스트 노드에 대한 작업을 수행하고 필요한 조작을 수행 할 수 있습니다.

XSLT의 문제점은 대부분의 구현에는 메모리의 전체 입력 트리가 필요하며 일반적으로 디스크 크기의 10 배입니다. 나는 XSLT 스트리밍을 할 수있는 Saxon XSLT 변압기의 상용 버전에 대해서만 알고있다. (그러나 그것은 당신의 필요에 완벽 할 것이다).

관련 문제