Не удается прочитать некоторые атрибуты с помощью SAX
-
20-09-2019 - |
Вопрос
Я пытаюсь разобрать этот документ с помощью SAX:
<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>
Я хорошо прочитал все атрибуты, кроме "initialstate" и "name"...Я получаю атрибуты с помощью обработчика startElement, но размер списка атрибутов для scxml равен нулю.Почему?Как я могу преодолеть эту проблему?
Редактировать:
public void startElement(String uri, String localName, String qName, Attributes attributes){
System.out.println(attributes.getValue("initialstate"));
System.out.println(attributes.getValue("name"));
}
это, при разборе первого тега, не работает (печатает "null" два раза).На самом деле,
attributes.getLength();
вычисляется равным нулю.
Спасибо
Решение
У меня есть полный пример работы с там и адаптировал его для вашего файла:
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);
}
}
и
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 + ">");
}
}
Результат:
<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>
Другие советы
Attributes.getValue()
это не так просто, как кажется.Тот самый Javadoc говорит:
Ищите значение атрибута по XML определенному (с префиксом) имени.
Таким образом, передача просто "initialstate" может не сработать, если есть какие-либо сложности с пространством имен, поскольку "initialstate" технически не является полным именем.
Я предлагаю поиграть с другими методами на Attributes
класс, такой как getValue(int)
, возможно, у вас будет больше успеха с ними.
Редактировать:Другая возможность заключается в том, что этот вызов startElement
это не относится к тому элементу, которым вы его считаете.Убедились ли вы, что localName
аргумент действительно есть scxml
, а не что-то другое?