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.

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

Заранее спасибо.
Ну и извините за столь громоздкий вопросец...
Re: SAX-парсинг. Элементы со значением новая строка (13)
От: alex-ikar Россия  
Дата: 11.10.06 14:39
Оценка:
Сорри, маленькое уточнение:

Тот аутпут, который я приводил выше — результат обработки этого xml-файла (выкинуто 2 последних элемента)...
<?xml version="1.0" ?>
<PHONEBOOK>
<PERSON>
<NAME>Green</NAME>
<EMAIL>green@yourserver.com</EMAIL>
</PERSON>
</PHONEBOOK>

Хотя в принципе сути вопроса это не меняет...
Re: SAX-парсинг. Элементы со значением новая строка (13)
От: Blazkowicz Россия  
Дата: 11.10.06 14:43
Оценка:
Здравствуйте, alex-ikar, Вы писали:


AI>НО откуда береться значение после элемента <NAME> перед элемнтом <EMAIL> (см.ниже)?


А если так
<?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>
Re[2]: SAX-парсинг. Элементы со значением новая строка (13)
От: alex-ikar Россия  
Дата: 11.10.06 15:29
Оценка:
Здравствуйте, Blazkowicz!

Так работает. Странно, неужели парсер на енто не заложен, или это просто не критично... ?
Да и потом, этоЖ не решение проблемы.. :

Мне тут предложили немного другой способ:
        public void characters(char[] chars, int start, int length) throws SAXException
        {
            // String value = new String(chars);
            // System.out.println("Element's value: [" + value.substring(start, start + length) + "]");
            /* */
            StringBuffer resBuff = new StringBuffer();
            for (int i = start; i < start + length; i++)
            { switch (chars[i])
                { // case '\\':
                  //  break;
                  // case '"':
                  //  break;
                  case '\n':
                    break;
                  case '\r':
                    break;
                  // case '\t':
                  //  break;
                  default:
                    resBuff.append(chars[i]);
                    break;
                }
            }
            System.out.println("Element's value: [" + resBuff.toString() + "]");
           /* */
        }



Результат тотже.
Re[2]: SAX-парсинг. Элементы со значением новая строка (13)
От: alex-ikar Россия  
Дата: 11.10.06 15:39
Оценка:
Точнее так:
            if (resBuff.length() > 0)
            {
                System.out.println("Element's value: [" + resBuff.toString() + "]");
            }
Re: SAX-парсинг. Элементы со значением новая строка (13)
От: Alex Leshkin  
Дата: 12.10.06 06:04
Оценка:
Здравствуйте, alex-ikar, Вы писали:

AI>Но, нормально-ли то, что на определенных итерациях возвращается в качестве значения элемента идет символ новой строки (13)... ?

Нормально

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

Потому что после элемента NAME идет новая строка, и этот символ так же как и остальные попадет в characters для PERSON.

AI>Element q-name: [NAME] started.

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

AI>Element q-name: [EMAIL] started.

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

А какая вообще разница, есть там перевод строки или нет... в XML главное — структура. Пока конечно перевод строки не будет относится к данным.
Re: SAX-парсинг. Элементы со значением новая строка (13)
От: ATAMAH Россия  
Дата: 12.10.06 07:10
Оценка:
Здравствуйте, alex-ikar, Вы писали:

>skipped


Немного неправильно написан метод characters, необходимо собирать все последовательности символов, например в StringBuffer:

      DefaultHandler handler = new DefaultHandler() {
          StringBuffer chunks = new StringBuffer();
...
        public void characters(char[] chars, int start, int length) throws SAXException
        {
            chunks.append(chars, start, length);
        }


до вызова метода endElement, только после этого все ситмволы внутри "элемента" будут "собраны" корректно. После этого удаляем всю незначащую информацию и выводим значение "элемента":

        public void endElement(String uri, String localName, String qName) throws SAXException
        {
            System.out.println("Element value: [" + chunks.toString().trim() + "]");
            System.out.println("Element q-name: [" + qName + "] stopped.");
            chunks = new StringBuffer();
        }
ATAMAH
Re: SAX-парсинг. Элементы со значением новая строка (13)
От: kan Великобритания  
Дата: 12.10.06 08:07
Оценка:
alex-ikar wrote:

> <NAME>Green</NAME>
> <EMAIL>green@yourserver.com</EMAIL>

> Но, нормально-ли то, что на определенных итерациях возвращается в
> качестве значения элемента идет символ новой строки (13)... ?
> Ну я понимаю для элементов <PHONEBOOK> и <PERSON> (при их встрече
> вызывается метод СтартЭлемент, далее Characters и пошло...), *НО откуда*
> береться значение после элемента <NAME> перед элемнтом <EMAIL> (см.ниже)?
Не понял вопрос. В исходном xml после закрытия </NAME> есть перевод строки. Парсер о нём и сообщает. Что не так? И как
по-твоему должно быть? И почему?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.