2016-07-19 4 views
-2

이제 xml 파일을 분석하기 위해 sax 파서를 사용합니다 (다음 샘플 코드는 tutorialspoint에서 제공함). 필자는 문자를 함수로 호출 할 때 BufferedWriter를 사용하여 txt 파일에 모든 것을 출력하려고합니다. 그러나이 방법을 사용하지는 않습니다. 이 BufferedWriter를 characters 함수에 작성하면 마지막 호출 만 기록하므로 마지막 문자열 만 출력합니다. 이 BufferedWriter를 main 함수에 작성하면 두 클래스이므로 UserHandler는 main 함수 (dblpSax 클래스)에서 작성된 BufferedWriter를 인식 할 수 없습니다. 나는 또한 sth를 시도해 클래스 인스턴스를 만들었지 만, 여전히 문제가있다. 이걸 만들 수있는 방법을 주시겠습니까? 감사. 당신은 DefaultHandler를 외부 최고의 사용자 정의 구문 분석과 동일한 수준에서 BufferedWriter의 필요주 함수에서 BufferedWriter를 작성하는 방법

File writename = new File("output.txt"); 
writename.createNewFile(); 
BufferedWriter out = new BufferedWriter(new FileWriter(writename)); 



    public class dblpSax{ 
    public static void main(String[] args){ 

     try { 
     File inputFile = new File("student.txt"); 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser saxParser = factory.newSAXParser(); 
     UserHandler userhandler = new UserHandler(); 
     saxParser.parse(inputFile, userhandler);  
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
} 


class UserHandler extends DefaultHandler { 

    boolean bFirstName = false; 
    boolean bLastName = false; 
    boolean bNickName = false; 
    boolean bMarks = false; 


    public void startElement(String uri, 
     String localName, String qName, Attributes attributes) 
     throws SAXException { 
     if (qName.equalsIgnoreCase("student")) { 
     String rollNo = attributes.getValue("rollno"); 
     System.out.println("Roll No : " + rollNo); 
     } else if (qName.equalsIgnoreCase("firstname")) { 
     bFirstName = true; 
     } else if (qName.equalsIgnoreCase("lastname")) { 
     bLastName = true; 
     } else if (qName.equalsIgnoreCase("nickname")) { 
     bNickName = true; 
     } 
     else if (qName.equalsIgnoreCase("marks")) { 
     bMarks = true; 
     } 
    } 


    public void endElement(String uri, 
     String localName, String qName) throws SAXException { 
     if (qName.equalsIgnoreCase("student")) { 
     System.out.println("End Element :" + qName); 
     } 
    } 


    public void characters(char ch[], 
     int start, int length) throws SAXException { 
     if (bFirstName) { 
     System.out.println("First Name: " 
     + new String(ch, start, length)); 
     bFirstName = false; 
     } else if (bLastName) { 
     System.out.println("Last Name: " 
     + new String(ch, start, length)); 
     bLastName = false; 
     } else if (bNickName) { 
     System.out.println("Nick Name: " 
     + new String(ch, start, length)); 
     bNickName = false; 
     } else if (bMarks) { 
     System.out.println("Marks: " 
     + new String(ch, start, length)); 
     bMarks = false; 
     } 
    } 
} 
+0

그리고 문제는 무엇입니까? 주의 createNewFile() 호출은 중복되어있다. – EJP

+0

우리는 문자 함수를 호출 할 때 BufferedWriter를 사용하여 .txt 파일로 모든 것을 출력하려고합니다. 질문은 BufferedWriter를 사용하는 방법입니까? – michael

답변

0

다음과 같이 내가 사용하려는

Bufferwriter입니다.

 try (BufferedWriter out = new BufferedWriter(....)) { 
      UserHandler userhandler = new UserHandler(out); 
      saxParser.parse(inputFile, userhandler);  
     } 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
} 

클래스 UserHandler는 DefaultHandler를 { 민간 최종의 BufferedWriter을 확장; // 또는의 PrintWriter

UserHandler(BufferedWriter out) { 
    this.out = out; 
} 

을 그리고 한 사람이 모든 사람을 대신하여 사방 out.write 수 있습니다.

+0

감사합니다. Joop. 이것은 실제로 도움이되고 나는 건축 방법으로 클래스들 사이에서 상호 작용하는 법을 배웁니다. 누군가 당신의 멋진 것을 주셔서 감사합니다. (나는 그들이 신중하게 고려하지 않는 것 같지만) – michael