2014-06-07 2 views
0

XML 파일에서 데이터를 읽고 SAX 구문 분석 방법을 사용하여 목록에 저장하려고합니다. 내 문제는 characters() 메서드를 사용하여 데이터 값을 저장하려고 할 때 발생합니다. 각 요소에 대해 나중에 값을 저장하기 위해 각 값과 몇 가지 추가 정보를 저장하는 객체를 만들고 있는데,이 값을 저장하려고하면 대신 공간이 저장됩니다. 나는 메소드 내부에서 인쇄를 시도해 보았고 모든 xml 파일을 통과하도록 이음새를 감싸는 동안 요소 몇 개만 인쇄하고 올바른 순서로 인쇄하지는 못했습니다. 그럼 내가 누락 된 부분을 누군가가 설명해 줄 수 있니?SAX 구문 분석 방법 charecters() 작동 방법

XML 파일 :

<?xml version="1.0" encoding="UTF-8"?> 
<CarModel> 
<Audi model = "TT" year = "2006" starting_price = "33.000$"> 
<type>sport</type> 
<horse_power>222hp</horse_power> 
<drivetrain>quattro</drivetrain 
<transmission>6_Manual</transmission> 
</Audi> 
<Mercedes model = "W222_S400" year = "2013" starting_price = 
63.000$"> 
<type>luxury</type> 
<horse_power>302hp</horse_power> 
<drivetrain>front_wheel_drive</drivetrain> 
<transmission>7_Automatic</transmission> 
</Mercedes> 
</CarModel> 

자바 코드 :

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 

     lvl_cnt++; 
     System.out.println(lvl_cnt); 
     obj = new xml_obj(); 
     obj.setLvl(lvl_cnt); 
System.out.println("LVL "+obj.getLvl()); 
     if (lvl_cnt == 0) { 
     obj.setValue(qName); 
     obj.setParent("root"); 
     System.out.println(obj.getParent()); 
     } 
     else { 
     xml_obj tmp = objListofLists.get(objListofLists.size()-1); 
     int lvl_before = tmp.getLvl(); 
     System.out.println("AAA" + lvl_before); 
     if (lvl_cnt > lvl_before) { 
      obj.setParent(tmp.getValue()); 
     } 
     else if (lvl_cnt < lvl_before) { 
      int j = 0; 
      while (objListofLists.get(j).getLvl() != lvl_cnt) j++; 
      tmp = objListofLists.get(j); 
      obj.setParent(tmp.getParent()); 
     } 
     else { 
      obj.setParent(tmp.getParent()); 
     } 
      System.out.println(obj.getParent()); 
     } 
     obj.attributes = attributes; 
     objListofLists.add(obj); 

    } 

    public void endElement(String uri, String localName, String qName) throws SAXException { 
     lvl_cnt--; 
    } 

    public void characters (char ch[], int start, int length) throws SAXException { 
    String help = new String(ch, start, length); 
    System.out.println(help); 
    objListofLists.get(objListofLists.size()-1).setValue(help); 
    } 
} 

답변

0

characters 방법은 요소만을 (속성이없는) 내부의 텍스트를 인쇄, 그러나 그것은 또한 모든 빈 공간을 포함, 개행이 do cument는 루트 요소의 자손입니다.

당신은 당신이 요소에 현재있는 경우, 당신은 (startElement()에서) 그 요소를 입력 할 때 endElement()에 다음 해제, 플래그를 설정해야하고, characters() 내부 테스트 특정 요소 안에있는 텍스트를 읽으려면 텍스트를 추출 할 원본 위치입니다.

private boolean inTypeTag = false; 

public void startElement(String uri, String localName, String qName, ...) ...{ 
    if (qName.equals("type") { 
     inTypeTag = true; 
    } 
    ... 
} 

public void endElement(String uri, String localName, String qName, ...) ...{ 
    if (qName.equals("type") { 
     inTypeTag = false; 
    } 
    ... 
} 

public void characters(char ch[], int start, int length) ... { 
    if (inTypeTag) { 
     // do something with the text ("sport") which was found in here 
    } 
    ... 
} 
+0

고마워요! 이 부울 변수의 메소드를 어떤 방식 으로든 수정할 수 있으므로 null을 덮어 썼다는 것을 알았 기 때문에 속성을 저장하고 저장할 수 있습니다. Map <>을 사용하여 제안하는 게시물을 보았지만 자바의 초보자이고 조금 복잡해 보입니다 ... – Saraki

+0

예. 많은 요소를 추적해야하는 경우 맵 또는 배열을 사용할 수 있습니다. XML 구조에 클래스 계층 구조를 만들 수도 있습니다. 물론 전체 문서를 매핑해야하는 경우 DOM이나 심지어 클래스를 생성하는 JAXB와 같은 API를 자동으로 사용하는 것이 좋습니다. SAX는 문서를 순차적으로 읽고 선택한 데이터를 추출해야 할 때 좋은 옵션입니다. 또한 Java SE의 일부이며 SAX와 DOM 사이에있는 StAX를 고려할 수도 있습니다. – helderdarocha