Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 4

Разбор xml

24.04.2017, 16:06. Показов 879. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте. Мне нужно создать приложение, которое будет искать заданные фразы в xml документах. Поиск осуществляю с помощью Lucene, разбор xml - sax парсером.
Как так бы сделать, чтобы переменные f_name и p_body вытащить из метода characters обработчика handler для того, чтобы дальше использовать в методe getDocument подскажите пожалуйста?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
public class Indexer 
{                
       public Indexer(String indexDirectoryPath)
           {           
             Directory indexDirectory = FSDirectory.open(new File(indexDirectoryPath));
             writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_36), true, IndexWriter.MaxFieldLength.UNLIMITED);
                 try 
                 {
                      SAXParserFactory factory = SAXParserFactory.newInstance();
                      SAXParser saxParser = factory.newSAXParser();                   
                      saxParser.parse("aaa.xml", handler);
                 } 
                 catch (Exception e) 
                 {
                      e.printStackTrace();
                 }
           } 
           private Document getDocument(File file) throws IOException
           {
            Document document = new Document(); 
            Field contentField = new Field(LuceneConstants.CONTENTS, p_body);
            Field nameField = new Field(LuceneConstants.FILE_NAME, f_name, Field.Store.YES, Field.Index.NOT_ANALYZED);
                
            document.add(contentField);
            document.add(fileNameField);
 
            return document;
        }   
 
        private void indexFile(File file)
            {           
             Document document = getDocument(file);
             writer.addDocument(document);
        }
               
            DefaultHandler handler = new DefaultHandler() 
            {
                boolean flag_first_name = false;   
                boolean flag_p = false;
 
                public String f_name;
                public String p_body;
                                
 
               @Override
               public void startElement(String uri, String localName,String qName,Attributes attributes) throws SAXException 
               {
                    if (qName.equalsIgnoreCase("first-name")) 
                    {
                            flag_first_name = true;
                    }
                    if (qName.equalsIgnoreCase("p")) 
                    {
                            flag_p = true;
                    }
               }
               @Override
               public void characters(char ch[], int start, int length) throws SAXException 
               {
                       if (flag_first_name) 
                      {    
                              this.f_name = new String(ch, start, length);
                              System.out.println(f_name);                                   
                              flag_first_name = false;
                       }
                       if (flag_p) 
                       {
                                 this.p_body = new String(ch, start, length);
                                 System.out.println(p_body);
                                 flag_p = false;
                       }
                  }
             };   
}
Добавлено через 1 час 1 минуту
Нашла что-то похожее на то что нужно , но опять возникает вопрос как из списка вытащить каждый элемент в отдельную строку?

Добавлено через 13 минут
Попробовала создать список, но не получается правильно написать обращение к нему.

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

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class SAXHandler extends DefaultHandler
{
        private ArrayList<String> mass;
        private boolean flag_first_name = false;   
        private boolean flag_last_name = false;
        private boolean flag_book_title = false;
        private boolean flag_p = false;
 
        public String[] getUsers()
        {
          return mass.toArray(new String[mass.size()]);
        }
        
        @Override
        public void startDocument() throws SAXException
        {
          mass = new ArrayList<String>();
        }
        
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
        {
          flag_first_name = "first-name".equals(qName);
          flag_p = "p".equals(qName);
        }
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException
        {
          if(flag_first_name)
            mass.add(0, new String(ch, start, length));
          if(flag_p)
            mass.add(1, new String(ch, start, length));
        }
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException
        {
          flag_first_name = false;   
          flag_p = false;
        }
        @Override
        public void endDocument() throws SAXException
        {
            
        }
}
Инициализация класса:
Java
1
2
3
4
5
6
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SAXHandler handler = new SAXHandler();
parser.parse(new File("aaa.xml"), handler);
for(String str : handler.getUsers())
    System.out.println(str);
Cкажите как правильно заменить эту строчку return mass.toArray(new String[mass.size()]); , чтобы я могла обратиться к конкретному элементу списка по его номеру? Вот что-то типо того должно быть return mass.get(0);?!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.04.2017, 16:06
Ответы с готовыми решениями:

Запись XML-дерева сразу в xml-файл (парсер JAXP)
Народ!Программеры!Помогите человеку,плиз! Парсерю я xml-файл,через DOM-модель,использую JAXP.После модификации надо все дерево записать в...

Java - XML: упаковать файл в xml
расскажите - каким образом можно создать xml документ с упакованным бианрным файлом внутри ? P.S. такое в принципе-то возможно ?

Парсинг XML не идёт разбор документа
Собственно есть код, который с малыми изменениями пользую давно. Сейчас чего-то не хочет читать XML-ку: public List&lt;URLxmlList&gt;...

1
 Аватар для Gr1f0nn
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
24.04.2017, 16:39
Java
1
 private ArrayList<String> mass;
Java
1
2
3
4
 public String[] getUsers()
        {
          return mass.toArray(new String[mass.size()]);
        }
Зачем вы пытаетесь вернуть новый массив строк, если у вас уже есть список с этими строками, к которому вы можете обращаться именно так:
Цитата Сообщение от Yulia_plic Посмотреть сообщение
Вот что-то типо того должно быть return mass.get(0);?!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.04.2017, 16:39
Помогаю со студенческими работами здесь

Разбор xml. Получить элемент по значению аттрибута
Доброго времени суток. есть строка, представляющая из себя фрагмент xml файла String xml = { &quot;&lt;?xml...

Java class вместо xml - persistence.xml
Приветствую уважаемые форумчане. Не совсем я силен ещё, поэтому и пришёл сюда чтобы спросить. Создал я persistence.xml. Всё хорошо,...

IOException parsing XML document from class path resource [src/resources/app-context.xml]; nested exception is
public class HelloWorldSpringDI { public static void main(String args) { ApplicationContext ctx = new...

Сохранение xml данных в xml-файл
Прошу помощи: Есть переменная json, которую необходимо перевести в xml, а затем сохранить на сервере в виде файла xml. Переменная...

Разбор XML
Доброго времени суток. Ребята подскажите как получить значение в этой части XML &lt;Direction Number=&quot;1&quot;&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru