2016-12-21 3 views
0

Ich bin ein Anfänger in JAVA SAX. Ich habe eine große XML Datei und ich möchte einige Informationen daraus extrahieren. unten ist die XML Datei, was ich und der Code extrahieren möchten:Wie bekomme ich den Wert eines bestimmten Elements von einem großen XML

Auszug aus der XML Datei:

... 
    <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> 
... 

Ich möchte:

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

Der Code (der Hauptklasse und meine Handler):

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

Was ist Ihre Frage? – geoffreydv

+0

Ich habe erwähnt, was ich will. Ich möchte einige Informationen aus der XML-Datei erhalten. Mein Code bringt mir nicht die richtigen Informationen. – bttX

+0

Also, wenn ich richtig verstehe, Sie wollen nicht die Werte, aber Sie möchten die Vorkommen bestimmter Elemente in der Datei zählen. Möchten Sie das counts pro Synset-Element oder nur über die gesamte Datei im Allgemeinen? – geoffreydv

Antwort

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; 
} 

Dieser Code verwendet einen Stream-Reader, dh er lädt nur jeweils ein Element im Speicher. Dies macht es auch für große Dateien effizient.

Eine Karte wird verwendet, um die Zählungen zu verfolgen. Jedes Mal, wenn ich auf ein "SynsetRelation" -Element stoße, überprüfe ich zuerst, ob es bereits gezählt ist, dann inkrementiere ich den Zähler.

Das Ergebnis ist eine Karte mit den Zählwerten pro erkanntem Wert.

Sie würde es so in der Hauptklasse verwenden:

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

danke Mann, aber können Sie den Code kommentieren, damit ich es verstehen und ändern kann, je nach Bedarf .. Wieder Tanks;) – bttX

+0

Gern geschehen. Ich habe etwas zusätzlichen Text unterhalb des Codes zur Verfügung gestellt, um es zu verdeutlichen. Wenn es bestimmte Teile gibt, über die Sie verwirrt sind, fragen Sie nach! – geoffreydv

+0

Ich habe am Ende meiner Antwort ein Verwendungsbeispiel hinzugefügt. Sie sollten einfach die countElements-Methode als private statische Methode zur Hauptklasse hinzufügen oder eine andere neue Klasse mit der darin enthaltenen Methode erstellen und diese dann aufrufen. (wie neu XmlCounter(). countElements();) – geoffreydv

Verwandte Themen