Kann nicht einige Attribute mit SAX lesen
-
20-09-2019 - |
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
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?