Не удается прочитать некоторые атрибуты с помощью SAX

StackOverflow https://stackoverflow.com/questions/2056216

  •  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, а не что-то другое?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top