2016-12-21 1 views
0

저는 초보자 인 JAVA SAX입니다. 파일 크기가 큰 XML이며 일부 정보를 추출하고 싶습니다. 내가 원하는큰 XML에서 특정 요소의 값을 가져 오는 방법

... 
    <Synset baseConcept="3" id="mizaAj_n2AR"> 
      <SynsetRelations> 
      <SynsetRelation relType="hyponym" targets="TaboE_n2AR"/> 
      <SynsetRelation relType="hyponym" targets="TaboE_n2AR"/> 
      <SynsetRelation relType="hypernym" targets="ragobap_n4AR"/> 
      <SynsetRelation relType="hypernym" targets="ragobap_n4AR"/> 
      <SynsetRelation relType="hypernym" targets="Tiybap_Aln~afos_n1AR"/> 
      <SynsetRelation relType="hypernym" targets="Tiybap_Aln~afos_n1AR"/> 
      </SynsetRelations> 
      <MonolingualExternalRefs> 
      <MonolingualExternalRef externalReference="04623612-n" externalSystem="PWN30"/> 
      </MonolingualExternalRefs> 
     </Synset> 
     <Synset baseConcept="3" id="ragobap_n4AR"> 
      <SynsetRelations> 
      <SynsetRelation relType="antonym" targets="mizaAj_n2AR"/> 
      <SynsetRelation relType="antonym" targets="mizaAj_n2AR"/> 
      </SynsetRelations> 
      <MonolingualExternalRefs> 
      <MonolingualExternalRef externalReference="04624826-n" externalSystem="PWN30"/> 
      </MonolingualExternalRefs> 
     </Synset> 
     <Synset baseConcept="3" id="tasal~uT_n1AR"> 
      <SynsetRelations> 
      <SynsetRelation relType="has_instance" targets="simap_n1AR"/> 
      <SynsetRelation relType="is_instance" targets="simap_n1AR"/> 
      </SynsetRelations> 
      <MonolingualExternalRefs> 
      <MonolingualExternalRef externalReference="04625882-n" externalSystem="PWN30"/> 
      </MonolingualExternalRefs> 
     </Synset> 
... 

: 다음 XML 파일에서

추출물 : 아래 I 추출 할 무엇 XML 파일 및 코드

hyponym: 2 
hypernym: 4 
antonym: 2 
has_instance: 1 
is_instance:1 

코드 (메인 클래스와 내 핸들러) :

import java.io.IOException; 
    import org.xml.sax.SAXException; 
    import org.xml.sax.XMLReader; 
    import org.xml.sax.helpers.XMLReaderFactory; 

    public class Main { 

     public static void main(String[] args) throws SAXException, IOException{ 

      XMLReader p = XMLReaderFactory.createXMLReader(); 
      p.setContentHandler(new handler()); 
      p.parse("test1.xml"); 
} 
    ---------------------------------------- 
import org.xml.sax.helpers.DefaultHandler; 

    public class handler extends DefaultHandler { 

     @Override 
     public void startElement(String SpacenameURI, String localName, 
       String qName, Attributes attrs) { 

      System.out.println("qname = " + qName); 
      String node = qName; 

      if (attrs != null) { 
       for (int i = 0; i < attrs.getLength(); i++) { 
        //nous récupérons le nom de l'attribut 
        String aname = attrs.getLocalName(i); 
        //Et nous affichons sa valeur 
        System.out.println("Attribut " + aname + " valeur : " + attrs.getValue(i)); 
       } 
      } 
     } 
    } 
+0

질문은 무엇입니까? – geoffreydv

+0

나는 내가 원하는 것을 언급했다. XML 파일에서 정보를 얻고 싶습니다. 내 코드가 올바른 정보를 얻지 못합니다. – bttX

+0

그래서 내가 올바르게 이해한다면, 당신은 값을 원하지 않지만 파일의 특정 엘리먼트의 발생 횟수를 세고 싶습니다. Synset 엘리먼트 당 카운트를 원합니까, 아니면 일반적으로 파일 전체를 원하는가? – geoffreydv

답변

0
public Map<String, Integer> countElements(File xmlFile) { 

    Map<String, Integer> counts = new HashMap<>(); 

    try { 
     XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
     FileInputStream fileInputStream = new FileInputStream(xmlFile); 
     XMLStreamReader reader = inputFactory.createXMLStreamReader(fileInputStream); 

     while(reader.hasNext()) { 
      reader.next(); 
      if(reader.isStartElement() && reader.getLocalName().equals("SynsetRelation")) { 
       String relTypeValue = reader.getAttributeValue("", "relType"); 

       if(!counts.containsKey(relTypeValue)) { 
        counts.put(relTypeValue, 0); 
       } 

       counts.put(relTypeValue, counts.get(relTypeValue) + 1); 
      } 
     } 

     fileInputStream.close(); 
    } catch (XMLStreamException | IOException e) { 
     e.printStackTrace(); 
    } 

    return counts; 
} 

이 코드는 스트림 판독기를 사용합니다. 즉, 한 번에 하나의 요소 만 메모리에로드합니다. 따라서 대용량 파일의 경우에도 효율적입니다.

지도를 사용하여 개수를 추적합니다. "SynsetRelation"요소를 만날 때마다 먼저 이미 계산되었는지 확인한 다음 카운터를 증가시킵니다.

결과는 감지 된 값당 개수를 포함하는 맵입니다.

당신은 당신의 메인 클래스에서 다음과 같이 사용합니다 :

public class Main { 
    public static void main(String[] args) { 
     Map<String, Integer> results = countElements(new File("your file location here.xml")); 
    } 
} 
+0

고마워,하지만 이해할 수 있고 필요에 따라 수정할 수 있도록 코드에 주석을 달 수 있습니까? 다시 탱크;) – bttX

+0

코드 아래에 텍스트를 명확히하기 위해 몇 가지 추가 텍스트를 제공했습니다. 혼란 스러울만한 부분이 있다면 멀리 물어보십시오! – geoffreydv

+0

내 대답의 맨 아래에 사용 예제를 추가 했으므로 countElements 메서드를 기본 정적 메서드로 주 클래스에 추가하거나 메서드가있는 다른 새 클래스를 만든 다음 호출해야합니다. (new XmlCounter(). countElements();) – geoffreydv