Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> regexp 
:(
    Опции темы
antsh
Дата 7.5.2006, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 72
Регистрация: 16.9.2005

Репутация: нет
Всего: нет



Сижу уже не первый час и никак не могу сообразить как мне забинтовать следующие выражения:
(Делаю XML parser)

Найти все  открывающие теги:
<[всё кроме "?" или "/"]*>

Найти все закрывающие теги:
<// *>

найти хедер:
<?*?>

Как вот эти 3 выражения оформить? smile  
PM   Вверх
LSD
Дата 7.5.2006, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



1.
Код
Pattern pattern = Pattern.compile("<[^\\?/]+>");


2.
Код
Pattern pattern = Pattern.compile("</[^\\?/]+>");


3.
Код
Pattern pattern = Pattern.compile("<\\?.+\\?>");


Только учти 2 вещи:
- ты неверно описал регулярки для тегов (в частности пробелы в именах тегов не допустимы)
- работать это будет гораздо медленней, чем стандартный SAX 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
antsh
Дата 7.5.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 72
Регистрация: 16.9.2005

Репутация: нет
Всего: нет



Что то не получается у меня ничего. Наверное что то не так делаю.
Вообщем у меня логика такая.

1) Открываю файл
2) Перегоняю содержимое в в другой файл и всё в одну строку. В итоге имею одну но очень большую строчку.
3) Работаю с этой строчкой. Используя String[] matches = input_line.split("<[^\\?/]+>"); для поиска всех открывающих тэгов. Но вот в результате ничего не получается. Что посоветуете изменить? smile  
PM   Вверх
LSD
Дата 7.5.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



У меня все работает. 

Приведи весь код, где ты перегоняешь данные из одно файла в другой. И кстати зачем ты это делаешь? 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
antsh
Дата 7.5.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 72
Регистрация: 16.9.2005

Репутация: нет
Всего: нет



Цитата

 И кстати зачем ты это делаешь? 

Проект в универе smile

Код

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.regex.*;

public class xml_parser {

    public static void main(String[] args) {
        String input_line;
        TextReader input;
        FileWriter output;

        // Pattern tag_opener = Pattern.compile("<[^\\?/]+>");
        // Pattern tag_closer = Pattern.compile("</[^\\?/]+>");
        // Pattern header = Pattern.compile("<\\?.+\\?>");

        int i = 0;
        try { // Create the input stream.
            input = new TextReader(
                    new FileReader("E:\\Java\\JOOP\\src\\in.txt"));
        } catch (FileNotFoundException e) {
            System.out.println(e);
            return; // End the program by returning from main().
        }
        try {
            output = new FileWriter("E:\\Java\\JOOP\\src\\out.txt");
        } catch (Exception e) {
            System.out.println(e);
            return;
        }
        try {
            while (input.eof() != true) {

                input_line = input.getln();
                output.write(input_line);

                i++;
            }

            output.close();
            input.close();

        } catch (Exception e) {
            System.out.println(e);
        }
        TextReader input2 = null;

        try {
            input2 = new TextReader(new FileReader(
                    "E:\\Java\\JOOP\\src\\out.txt"));
        } catch (Exception e) {
            System.out.println(e);
        }

        input_line = input2.getln();
        String[] mat = input_line.split("<[^\\?/]+>");

        System.out.println("Good");
        return;
    }
}

 
PM   Вверх
LSD
Дата 7.5.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



1. В состав JDK не входит класс TextReader
2. Я спрашивал почему, ты перегоняешь XML в одну строку? Regexp нормально работают с выражениями состоящими из нескольких строк. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
antsh
Дата 8.5.2006, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 72
Регистрация: 16.9.2005

Репутация: нет
Всего: нет



Ну текст ридер это вообщем то не хитрая библиотека, собственно не так уж важна сама суть, с её помощь я всего лишь считыввааю строчку, а вот почему я использую одну строку - да потмоу что со строчкой удобней работать чем с несколькими строками, задаёшь искать символ и всё. Вообщем какой обычно метод для парсинга ХМЛ используется, как я понял мой не катит совсем smile 
PM   Вверх
LSD
Дата 8.5.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(antsh @  8.5.2006,  03:18 Найти цитируемый пост)
использую одну строку - да потмоу что со строчкой удобней работать чем с несколькими строками, задаёшь искать символ и всё.

Можно было закачать данные из файла в один StringBuffer со всеми переводами строки и прочим.


Цитата(antsh @  8.5.2006,  03:18 Найти цитируемый пост)
Вообщем какой обычно метод для парсинга ХМЛ используется

Если использовать SAX, то это будет происходить приблизительно так:

SAX - это событийный парсер для XML, т.е. он последовательно читает и рабирает данные из входного потока (это может быть файл, сетевое соединение, или любой другой InputStream). Когда парсер находит структурный элемент (открывающий тег, закрывающий тег, и т.п.), он оповещает об этом слушателя, и передает ему в качестве параметра найденый элемент. Слушатель делает все необходимые операции для данного элемента.

Работа с SAX выглядит приблизительно так:

1. Создаем свой обработчик событий, наследуя его от базового класса DefaultHandler, и переопределяем в нем нужные нам методы. Пусть нам надо занести данные из всех элементов <user> в ArrayList.
Код
public class SAXHandler extends DefaultHandler
{
  private ArrayList<String> users;
  private boolean isUserTag = false;

  public String[] getUsers()
  {
    return users.toArray(new String[users.size()]);
  }

  @Override
  public void startDocument() throws SAXException
  {
    users = new ArrayList<String>();
  }

  @Override
  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
  {
    isUserTag = "user".equals(qName);
  }

  @Override
  public void characters(char[] ch, int start, int length) throws SAXException
  {
    if(isUserTag)
      users.add(new String(ch, start, length));
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException
  {
    isUserTag = false;
  }

  @Override
  public void endDocument() throws SAXException
  {
  }
}


2. Создаем фабрику парсеров и создаем парсер:
Код
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();


3. Парсим файл указав в качестве аргумента свой обработчик:
Код
SAXHandler handler = new SAXHandler();
parser.parse(new File("some.xml"), handler);


4. Если надо, можно указать парсеру, проверять документ по схеме:
Код
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new File(""));

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
factory.setSchema(schema);

Примечание: это будет работать в JDK 1.5 и старше, в более младших версиях надо будет обновить JAXP.

Все вместе:
Берем такой файл:
Код
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <user>User 1</user>
  <userParam>Param 1</userParam>

  <user>User 2</user>
  <userParam>Param 2</userParam>

  <user>User 3</user>
  <userParam>Param 3</userParam>
</root>

Парсим его:
Код
public class SAXHandler extends DefaultHandler
{
  private ArrayList<String> users;
  private boolean isUserTag = false;

  public String[] getUsers()
  {
    return users.toArray(new String[users.size()]);
  }

  @Override
  public void startDocument() throws SAXException
  {
    users = new ArrayList<String>();
  }

  @Override
  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
  {
    isUserTag = "user".equals(qName);
  }

  @Override
  public void characters(char[] ch, int start, int length) throws SAXException
  {
    if(isUserTag)
      users.add(new String(ch, start, length));
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException
  {
    isUserTag = false;
  }

  @Override
  public void endDocument() throws SAXException
  {
  }

  public static void main(String[] args) throws Exception
  {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();

    SAXHandler handler = new SAXHandler();
    parser.parse(new File("some.xml"), handler);

    for(String user : handler.getUsers())
      System.out.println("user = " + user);
  }
}

Получаем на выходе:
Код
user = User 1
user = User 2
user = User 3
 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0684 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.