Frage

Ich versuche, das Dokument mit SAX zu analysieren:

<scxml version="1.0" initialstate="start" name="calc"> 
  <datamodel> 
      <data id="expr" expr="0" /> 
      <data id="res" expr="0" /> 
  </datamodel> 
  <state id="start"> 
      <transition event="OPER" target="opEntered" /> 
      <transition event="DIGIT" target="operand" /> 
  </state> 
  <state id="operand"> 
      <transition event="OPER" target="opEntered" /> 
      <transition event="DIGIT" /> 
  </state> 
</scxml>

las ich alle Attribute gut, mit Ausnahme von „initial“ und „name“ ... Ich erhalte die Attribute mit dem Startelement-Handler, aber die Größe der Attributliste für SCXML Null ist. Warum? Wie kann ich dieses Problem überwinden?

Bearbeiten :

public void startElement(String uri, String localName, String qName, Attributes attributes){
  System.out.println(attributes.getValue("initialstate"));
  System.out.println(attributes.getValue("name")); 
}

, dass, wenn der erste Tag Parsen, funktioniert nicht (druckt „null“ zweimal). In der Tat,

attributes.getLength();

auswertet auf Null zurück.

Danke

War es hilfreich?

Lösung

Ich habe ein vollständiges Beispiel bekam Arbeit von dort und angepasst es für die Datei:

public class SaxParserMain {

    /**
     * @param args
     * @throws SAXException
     * @throws ParserConfigurationException
     * @throws IOException
     */
    public static void main(String[] args) throws ParserConfigurationException, SAXException,
            IOException {
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        CustomHandler handler = new CustomHandler();
        parser.parse(new File("file/scxml.xml"), handler);
    }
}

und

public class CustomHandler extends DefaultHandler {

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes)
            throws SAXException {
        System.out.println();
        System.out.print("<" + qName + "");
        if (attributes.getLength() == 0) {
            System.out.print(">");
        } else {
            System.out.print(" ");
            for (int index = 0; index < attributes.getLength(); index++) {
                System.out.print(attributes.getLocalName(index) + " => "
                        + attributes.getValue(index));
            }
            System.out.print(">");
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.print("\n</" + qName + ">");
    }
}

Die Ausgabe lautet:

<scxml version => 1.0initialstate => startname => calc>
<datamodel>
<data id => exprexpr => 0>
</data>
<data id => resexpr => 0>
</data>
</datamodel>
<state id => start>
<transition event => OPERtarget => opEntered>
</transition>
<transition event => DIGITtarget => operand>
</transition>
</state>
<state id => operand>
<transition event => OPERtarget => opEntered>
</transition>
<transition event => DIGIT>
</transition>
</state>
</scxml>

Andere Tipps

Attributes.getValue() ist nicht so einfach, wie es aussieht. Die javadoc sagt:

  

Look der Wert eines Attributs von XML-up   qualifiziert (mit dem Präfix) Namen.

So nebenbei nur „initial“ möglicherweise nicht, wenn es irgendwelche Namensraum Komplikationen sind, da „initial“ technisch nicht einen qualifizierten Namen.

Ich schlage vor, ein Spiel mit den anderen Methoden auf der Attributes Klasse, wie getValue(int) habe, könnten Sie mehr Erfolg mit denjenigen haben.


Bearbeiten : Eine weitere Möglichkeit ist, dass dieser Aufruf von startElement bezieht sich nicht auf das Element Sie denken, es ist. Haben Sie sich vergewissern, dass das localName Argument ist in der Tat scxml, und nicht etwas anderes?

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