Frage

Edit: Dieser Code ist in Ordnung. Ich fand eine irgendwo Logik Fehler, der in meinem Pseudo-Code existiert nicht. Ich war auf meinem Mangel an Java Erfahrung Schuld.

Pseudo-Code unten, ich versuche, die XML gezeigt zu analysieren. Ein dummes Beispiel vielleicht, aber mein Code war zu groß / spezifisch für jedermann einen wirklichen Wert zu erhalten, um es zu sehen und zu lernen, aus den Antworten gepostet. Also, das ist mehr unterhaltsam und hoffentlich andere aus der Antwort sowie ich lernen können.

Ich bin neu in Java, sondern einen erfahrenen C ++ Programmierer, die mir mein Problem in meinem Verständnis der Sprache Java liegt glauben macht.

Problem: Wenn der Parser beendet, mein Vektor ist voll von nicht initialisierten Kühen. Ich schaffe den Vektor von Kühen mit einer Standardkapazität (die nicht bewirken sollte es ist „Größe“, wenn es so etwas wie C ++ STL Vektor ist). Wenn ich den Inhalt der Kuh Vector aus nach dem Parse drucken, gibt es die richtige Größe von Vector aber alle Werte erscheinen nie gesetzt worden zu sein.

. Info: Ich habe dies erfolgreich getan mit anderen Parsern, die Vector nicht haben Felder , aber in diesem Fall möchte ich eine Vektor verwenden Cow Eigenschaften zu akkumulieren

Moreinfo: Ich kann nicht Generika verwenden (Vector ), so bitte mich nicht dort hin. :)

Vielen Dank im Voraus.

<pluralcow>
        <cow>
            <color>black</color>
            <age>1</age>
        </cow>
        <cow>
            <color>brown</color>
            <age>2</age>
        </cow>
        <cow>
            <color>blue</color>
            <age>3</age>
        </cow>
</pluralcow>

public class Handler extends DefaultHandler{
    // vector to store all the cow knowledge
    private Vector  m_CowVec;

    // temp variable to store cow knowledge until
    // we're ready to add it to the vector
    private Cow     m_WorkingCow;

    // flags to indicate when to look at char data
    private boolean m_bColor;
    private boolean m_bAge;

    public void startElement(...tag...)
    {
        if(tag == pluralcow){   // rule: there is only 1 pluralcow tag in the doc
                // I happen to magically know how many cows there are here.             
                m_CowVec = new Vector(numcows);
        }else if(tag == cow ){  // rule: multiple cow tags exist
            m_WorkingCow = new Cow();
        }else if(tag == color){ // rule: single color within cow
            m_bColor = true;
        }else if(tag == age){   // rule: single age within cow
            m_bAge = true;
        }
    }

    public void characters(...chars...)
    {
        if(m_bColor){
            m_WorkingCow.setColor(chars);   
        }else if(m_bAge){
            m_WorkingCow.setAge(chars);
        }
    }

    public void endElement(...tag...)
    {
        if(tag == pluralcow){
            // that's all the cows
        }else if(tag == cow ){
            m_CowVec.addElement(m_WorkingCow);      
        }else if(tag == color){
            m_bColor = false;
        }else if(tag == age){
            m_bAge = false;
        }
    }
}
War es hilfreich?

Lösung

Der Code sieht für mich in Ordnung. Ich sage Satz Haltepunkte am Anfang jeder Funktion und beobachten Sie es im Debugger oder einige print-Anweisungen hinzufügen. Mein Bauch sagt mir, dass entweder characters() nicht aufgerufen werden oder setColor() und setAge() nicht richtig funktionieren, aber das ist nur eine Vermutung.

Andere Tipps

Wenn Sie sagen, dass die Kühe sind nicht initialisiert werden die String-Eigenschaften auf null initialisiert? Oder leere Strings?

Ich weiß, du erwähnt, dass diese Pseudo-Code ist, aber ich wollte nur ein paar mögliche Probleme hinweisen:

public void startElement(...tag...)
    {
        if(tag == pluralcow){   // rule: there is only 1 pluralcow tag in the doc
                // I happen to magically know how many cows there are here.                     
                m_CowVec = new Vector(numcows);
        }else if(tag == cow ){  // rule: multiple cow tags exist
                m_WorkingCow = new Cow();
        }else if(tag == color){ // rule: single color within cow
                m_bColor = true;
        }else if(tag == age){   // rule: single age within cow
                m_bAge = true;
        }
    }

Sie sollten wirklich mit tag.equals (...) anstelle von Tag sein == ... hier.

public void characters(...chars...)
{
    if(m_bColor){
            m_WorkingCow.setColor(chars);   
    }else if(m_bAge){
            m_WorkingCow.setAge(chars);
    }
}

Ich nehme an, Sie sich dessen bewusst sind, aber diese Methoden ist eigentlich mit einem Zeichenpuffer mit Start- und End-Indizes bezeichnet.

Beachten Sie auch, dass Zeichen (...) kann mehrfach für einen einzelnen Textblock, die Rückkehr kleine Stücke in jedem Aufruf aufgerufen werden: http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/ContentHandler.html#characters (char [],% 20int,% 20int)

  

“... SAX-Parser können alle zusammenhängenden Rück   Zeichendaten in einem einzelnen Chunk, oder   sie kann es in mehrere Stücke aufgeteilt ... "

Ich bezweifle, werden Sie in dieses Problem in dem einfachen Beispiel laufen Sie zur Verfügung gestellt, aber Sie erwähnt auch, dass dies eine vereinfachte Version eines komplexeren Problem. Wenn in Ihrem ursprünglichen Problem, Ihre XML von großen Textblöcken bestehen, dann ist dies etwas zu prüfen.

Schließlich, wie andere schon erwähnt haben, wenn Sie könnten, es ist eine gute Idee, eine XML-Rangier-Bibliothek (zum Beispiel JAXB, Castor, JiBX, XMLBeans, XStream einige zu nennen).

betrachten

Ich muss sagen, dass ich bin kein großer Fan von diesem Entwurf. Sie sind jedoch sicher, dass Ihre Charaktere jemals genannt wird? (Vielleicht ein paar system.outs helfen würde). Wenn es nie genannt wird, würden Sie mit einer nicht initialisierten Kuh am Ende.

Auch würde ich nicht versuchen, einen XML-Parser selbst so zu implementieren, da Sie robuster gegen Validierungsprobleme sein müssen.

Sie SAX oder DOM4J verwenden können, oder noch besser, verwenden Sie Apache Kochers.

Auch wenn ich ein Schema I jaxb oder einen anderen Code-Generator zur Beschleunigung der Entwicklung von XML-Interface-Code verwenden. Die Code-Generatoren verbergen viel von der Komplexität der Arbeit direkt mit SAX oder DOM4J.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top