2편에선 <T 를 치환했었죠. 사실 저렇게 치환하는건 정해진 형태만 치환되기때문에 정확히 수행되는건 아닙니다.
<wchar_t> 뭐 이런게 있다면 치환이 안되겠죠.
그래서 이번엔 태그 내용 속에 있는 "<"만 파싱하고 싶을때 어떻게 하는지 포스팅하겠습니다.
&나 "와 같은 <가 아닌 특수문자를 파싱하고 싶으신 분은 태그에 영향을 주지 않기때문에 아래 포스팅을 참고하시면 됩니다.
2017/11/16 - [IT/Language] - Java DOM파서 2편 - 특수문자가 있는 XML파싱하기
<가 있는 모든 값을 치환하고 싶은데 어떻게 해야하나 생각을 하며 검색하다가 해결한 방법입니다.
물론 더 효율적인 방법이 있겠지만 제가 생각해낸 방법을 소개하겠습니다.
2편에선 replaceAll() 을 통해서 특수문자들을 치환했었습니다.
여기서도 동일하게 수행합니다. 다만, 태그의 특수문자까지 치환해버리는 문제를 해결하기 위해 추가 작업을 하게 됩니다.
그럼 2편에서 사용했던 예시를 여기서도 사용하겠습니다.
기존에 <T를 변환했던 코드에 <를 변환하도록 살짝만 수정하겠습니다.
String xml = null; try { File inputFile = new File(“C:\users\test.xml”); File outFile = new File(intputFile+”.temp”); FileInputStream inputStream = new FileInputStream(intputFile); FileOutputStream outputStream = new FileOutputStream(outFile);; BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(outputStream)); while((xml = br.readLine()) != null) { xml = xml.replaceAll("<", "<"); // <를 <로 변환 bw.write(xml + "\r\n"); bw.flush(); } bw.close(); br.close(); inputFile.delete(); outFile.renameTo(inputFile); } catch(Exception e) { e.printStackTrace(); }
이렇게 됩니다. 사실 그냥 T만 지웠습니다. xml파일 안의 <를 <로 변환하는 코드입니다.
변환을 위한 모든 부분은 while문 안에서 이루어지기때문에 이제부터 while문만 따로 빼내서 보겠습니다.
그 이외엔 파일을 읽고 쓰고 닫고 하는 부분이기때문에 제외하겠습니다.
while((xml = br.readLine()) != null) { xml = xml.replaceAll("<", "<"); // <를 <로 변환 bw.write(xml + "\r\n"); bw.flush(); }
이렇게 구현이 됐을때, 태그의 <(start tag)까지 모두 <로 변환시켜버리는 문제가 있다는 걸 지난 포스팅에서 알려드렸습니다.
그래서 검색하다 생각해낸 방법은 어차피 태그는 처음과 끝에 위치하니, 일단 <로 전부 변환시켜놓고 그 이후에 처음과 끝(tag)만 <로 다시 만들자는 생각을 했습니다.
다음과 같은 순서가 되겠죠.
1단계. 모든 <를 <로 변환시킨다.
2단계. 처음과 끝의 <만 <로 변환시킨다.
xml 파일에 다음과 같은 내용이 있었다라고 가정해봅니다.
<tag>da<>ta</tag>
1단계를 수행하면 <tag>da<>ta</tag> 이렇게 변환될 것입니다.
그리고 2단계를 수행하면 <tag>da<>ta</tag> 이렇게 변하겠죠.
파싱에 문제가 됐던 <를 <로 변환시켰기때문에 파싱이 가능해졌습니다. tag의 <는 살렸기때문에 문제도 발생하지 않습니다.
xml파일을 원래대로 돌려놓고 싶다면 한 번 더 <를 <로 바꿔주면 되겠습니다. 대신 파싱을 수행한 이후에 해야겠죠.
2단계를 수행하기 위해서 처음과 끝을 바꿔주는 replaceFirst와 replaceLast를 사용했습니다.
replaceFirst는 replaceAll처럼 기본으로 제공해주지만 replaceLast는 없는 메소드기 때문에 직접 구현했습니다.
replaceLast 메소드입니다.
public static String replaceLast(String xml, String toReplace, String replacement) { int pos = string.lastIndexOf(toReplace); if (pos > -1) { return string.substring(0, pos)+ replacement + string.substring(pos + toReplace.length(), string.length()); } else { return string; } }
문자열을 전달하고 해당 문자열의 마지막 target을 replace로 변환하도록 했습니다.
이제 replaceFirst와 replaceLast를 사용해서 특수문자를 치환해보겠습니다.
while문 안에서 1,2단계를 모두 수행합니다.
while((xml = br.readLine()) != null) {
while((xml = br.readLine()) != null) { xml = xml.replaceAll("<", "<"); //1단계: 모든 <를 <로 변환합니다. xml = xml.replaceFirst("<", "<"); //2단계: 가장 처음 <를 <로 변환합니다. xml = replaceLast(xml, "<", "<"); // 마지막 <를 <로 변환합니다. bw.write(xml + "\r\n"); bw.flush(); }
이렇게 치환해놓으면 파일에는 <tag>da<>ta</tag> 이렇게 저장되어 있을 겁니다.
만약 파일을 원상태로 돌려놔야한다면, 1단계의 파라미터를 반대로 쓰고 한번 더 수행하시면 됩니다.
xml = xml.replaceAll("<", "<");
이렇게요.
대신 파싱을 수행한 후에 파일을 다시 읽어서 바꿔줘야합니다. 그러니까 파일을 읽고 쓰고 닫고 파싱하고 다시 읽고 쓰고 닫고가 되겠죠.
말이 되게 어렵네요.
1. 파일을 오픈해서 특수문자를 치환한다.
2. 치환한 내용을 파일에 쓴다.
3. 오픈한 파일을 닫는다.
4. xml파일에 특수문자가 치환됐으므로 파싱한다.(builder.parse)
(다시 원래대로 돌려놓고 싶을 경우)
5. 1번부터 3번까지 다시 반복한다. 대신 <를 <로 치환만 하면 된다.
'IT > Language' 카테고리의 다른 글
JAVA - 오라클 DB에 쿼리 날리기( INSERT, DELETE, UPDATE) (0) | 2017.12.07 |
---|---|
JAVA - 오라클 트랜잭션(Transaction) 명령어 - COMMIT, ROLLBACK, SAVEPOINT (0) | 2017.12.06 |
오라클 시퀀스(Sequence) 사용 및 .NEXTVAL 초기화 (0) | 2017.12.03 |
Java DOM파서 2편 - 특수문자가 있는 XML파싱하기 (0) | 2017.12.01 |
Java DOM파서 1편 - 여러 형태의 XML파일 파싱하기 (0) | 2017.11.30 |