SAX-парсинг. Элементы со значением новая строка (13)
От: alex-ikar Россия  
Дата: 11.10.06 14:32
Оценка:
Всем привет!

Есть программа:
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class xml {

  public static void main(String args[]) {

    if (args.length != 1) {
      System.err.println("Usage: java NameLister xmlfile.xml");
      System.exit(-1);
    }

    try {

      SAXParserFactory factory = SAXParserFactory.newInstance();
      SAXParser saxParser = factory.newSAXParser();

      DefaultHandler handler = new DefaultHandler() {

        public void startDocument() throws SAXException
        {
            System.out.println("----------------------- Start of the document ----------------------------");
        }

        public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException
        {
            System.out.println("Element q-name: [" + qName + "] started.");

            int attrCnt = attrs.getLength();
            for (int i=0; i < attrCnt; i++)
            {
                System.out.println( "Attribute [" + attrs.getLocalName(i) + "] "
                                  + "Type [" + attrs.getType(i) + "]"
                                  + "Value [" + attrs.getValue(i) + "]"
                                   );
            }
        }

        public void characters(char[] chars, int start, int length) throws SAXException
        {
            String value = new String(chars);
            System.out.println("Element value: [" + value.substring(start, start + length) + "]");
        }

        public void endDocument() throws SAXException
        {
            System.out.println("----------------------- End of the document ----------------------------");
        }

        public void endElement(String uri, String localName, String qName) throws SAXException
        {
            System.out.println("Element q-name: [" + qName + "] stopped.");
        }
      };

      saxParser.parse(args[0], handler);

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Есть хml-файл, который надо распарсить:
<?xml version="1.0" ?>
<PHONEBOOK>
<PERSON>
<NAME>Green</NAME>
<EMAIL>green@yourserver.com</EMAIL>
<TELEPHONE>9001-999-201</TELEPHONE>
<WEB>www.java.com</WEB>
</PERSON>
</PHONEBOOK>

Прога работает — парсит, вроде все Ок:
----------------------- Start of the document ----------------------------
Element q-name: [PHONEBOOK] started.
Element value: [
]
Element q-name: [PERSON] started.
Element value: [
]
Element q-name: [NAME] started.
Element value: [Green]
Element q-name: [NAME] stopped.
Element value: [
]
Element q-name: [EMAIL] started.
Element value: [green@yourserver.com]
Element q-name: [EMAIL] stopped.
Element value: [
]
Element q-name: [PERSON] stopped.
Element value: [
]
Element q-name: [PHONEBOOK] stopped.
----------------------- End of the document ----------------------------

Но, нормально-ли то, что на определенных итерациях возвращается в качестве значения элемента идет символ новой строки (13)... ?
Ну я понимаю для элементов <PHONEBOOK> и <PERSON> (при их встрече вызывается метод СтартЭлемент, далее Characters и пошло...), НО откуда береться значение после элемента <NAME> перед элемнтом <EMAIL> (см.ниже)?

Element q-name: [NAME] started.
Element value: [Green]
Element q-name: [NAME] stopped.
Element value: [
]

Element q-name: [EMAIL] started.

В принципе так мне при парсинге необходимо выдирать значения только для определенных элементов — может меня это и не коснется, но мне хотелось-бы понять причину подобной ситуации..

Заранее спасибо.
Ну и извините за столь громоздкий вопросец...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.