2016-12-21 14 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ファイルから

エキス:以下、私が抽出したいもの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; 
} 

このコードはStreamリーダーを使用しています。つまり、一度に1つの要素だけをメモリにロードします。これにより、大容量のファイルであっても効率的です。

マップを使用してカウントを記録します。私が "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メソッドを追加するか、メソッドを持つ別の新しいクラスを作成して呼び出してください。 (新しいXmlCounter()のようにcountElements();) – geoffreydv

関連する問題