powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / задача на Java/XML
21 сообщений из 21, страница 1 из 1
задача на Java/XML
    #32949637
Kama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Товарищи, помогите пожалуйста решить задачу. Другу срочно надо. Проблема состоит в следующем:
Дан xml документ.
<a>
<b>
<c>value1</c>
<d>value2</d>
</b>
</a>
Надо написать программу на java, которая обработает этот документ и найдет в дереве документа value1 или value2. А потом укажет путь к этому значению.
Например, если задать такой запрос:
c:\java Parser document.xml value2
То ответом будет: a -> b -> d
Помогите, пожалуйста!
...
Рейтинг: 0 / 0
задача на Java/XML
    #32949673
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используя dom4j можно примерно так:

Код: plaintext
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.
 import  org.dom4j.Document;
 import  org.dom4j.Node;
 import  org.dom4j.io.DOMReader;

 import  javax.xml.parsers.DocumentBuilder;
 import  javax.xml.parsers.DocumentBuilderFactory;
 import  java.util.Iterator;
 import  java.util.List;

 public   class  TestSearch {

   public   static   void  main(String[] args)
     throws  Exception {
     if  (args.length <  2 ) {
      System.out.println("usage: TestSearch file value");
      System.exit( 0 );
    }
    // Parse a DOM tree.
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    org.w3c.dom.Document domDocument = builder.parse(args[ 0 ]);

    // Now convert to DOM4J model.
    DOMReader reader =  new  DOMReader();
    Document document = reader.read(domDocument);

    // List of nodes with search value.  
    List nodes = document.selectNodes("//*[starts-with(., '" + args[1] + "')]");
     for  (Iterator it = nodes.iterator(); it.hasNext();) {
      Node node = (Node) it.next();
       if  (node.getText().equals(args[ 1 ])) {
        System.out.println(node.getPath());
      }
    }

  }

}
...
Рейтинг: 0 / 0
задача на Java/XML
    #32949694
Kama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое.
Сейчас установлю dom4j.
Еще один вопрос: А можно это сделать посредством Xerces Java Parser ?
...
Рейтинг: 0 / 0
задача на Java/XML
    #32949701
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, можно, может быть дополнительно следует воспользоваться Xalan - про него на этой странице сказано, что он работает с XSLT. Т.е. нужно разобрать XML, после чего найти в нем все, что соответствует XSLT-шаблону //*[starts-with(., 'value2')]
...
Рейтинг: 0 / 0
задача на Java/XML
    #32949744
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на самом деле, достаточно просто получить дерево документа

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
org.w3c.dom.Document domDocument = builder.parse(args[0]);

и затем просто обойти все его узлы в поисках нужного текстое node, запоминая текущий путь.
думаю с алгоритмом обходом дерева (поиск в глубину) проблем не должно возникнуть...

"достаточно" в том смысле, что привлекать понятие xpath вовсе не обязательно, равно как и библиотеки не входящие в состав jdk.

хотя согласен, jdom удобная штука :)
...
Рейтинг: 0 / 0
задача на Java/XML
    #32949746
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. dom4j.
...
Рейтинг: 0 / 0
задача на Java/XML
    #32949881
Kama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NotGonnaGetUsна самом деле, достаточно просто получить дерево документа

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
org.w3c.dom.Document domDocument = builder.parse(args[0]);

и затем просто обойти все его узлы в поисках нужного текстое node, запоминая текущий путь.
думаю с алгоритмом обходом дерева (поиск в глубину) проблем не должно возникнуть...

В том то и дело, что я в этом деле не кумекаю. Можешь, пожалуйста, написать примерно обход "дерева" и как черер java сделать поиск по заданному тексту? Буду премного благодарен.
...
Рейтинг: 0 / 0
задача на Java/XML
    #32949935
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так
Код: plaintext
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.
     public  String[] findText(Document doc, String text) {
         if  (text ==  null )  throw   new  NullPointerException("text");
        ArrayList results =  new  ArrayList();
        findTextNode(doc.getDocumentElement(), text, results,  new  Stack());
         return  (String[]) results.toArray( new  String[results.size()]);
    }

     private   void  findTextNode(Node root, String text, ArrayList results, Stack path) {
        NodeList child = root.getChildNodes();
         for  ( int  i =  0 ; i < child.getLength(); i++) {
            Node n = child.item(i);
             switch  (n.getNodeType()) {
                 case  Node.TEXT_NODE:
                     if  (text.equals(n.getNodeValue())) {
                        addResult(results, path);
                    }
                     break ;
                 case  Node.ELEMENT_NODE:
                    path.push(n.getNodeName());
                    findTextNode(n, text, results, path);
                    path.pop();
                     break ;
            }
        }
    }

     private   void  addResult(ArrayList results, Stack path) {
        StringBuffer sb =  new  StringBuffer();
         for  ( int  i =  0 ; i < path.size()- 1 ; i++) {
           sb.append(path.get(i)).append("->");
        }
        sb.append(path.peek());
        results.add(sb.toString());
    }
...
Рейтинг: 0 / 0
задача на Java/XML
    #32950104
Kama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Thnx to NotGonnaGetUs. Прописываю.

Денису Попову: у меня ошибка выходит :(
Exception in thread "main" java.lang.NoClassDefFoundError: org/dom4j/io/DOMReader at TestSearch.main.
Из-за чего может быть? Вроде пути к классам правильно указываю.
...
Рейтинг: 0 / 0
задача на Java/XML
    #32950294
Kama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Компилирую так:
javac -classpath c:\dom4j\dom4j-1.5.2.jar TestSearch.java
Ошибки не выходит.
Потом запускаю программу:
java TestSearch parser.xml a
и потом выходит эта ошибка
Exception in thread "main" java.lang.NoClassDefFoundError: org/dom4j/io/DOMReader at TestSearch.main.

Пробовал так запускать:
java -cp c:\dom4j\dom4j-1.5.2.jar . TestSearch parser.xml a
Тогда выходит ошибка:
Exception in thread "main" java.lang.NoClassDefFoundError: TestSearch

Что я делаю не так?
...
Рейтинг: 0 / 0
задача на Java/XML
    #32950479
KamaКомпилирую так:
javac -classpath c:\dom4j\dom4j-1.5.2.jar TestSearch.java
Ошибки не выходит.
Потом запускаю программу:
java TestSearch parser.xml a
и потом выходит эта ошибка
Exception in thread "main" java.lang.NoClassDefFoundError: org/dom4j/io/DOMReader at TestSearch.main.

Пробовал так запускать:
java -cp c:\dom4j\dom4j-1.5.2.jar . TestSearch parser.xml a
Тогда выходит ошибка:
Exception in thread "main" java.lang.NoClassDefFoundError: TestSearch

Что я делаю не так?

java -cp .;c:\dom4j\dom4j-1.5.2.jar TestSearch parser.xml a
...
Рейтинг: 0 / 0
задача на Java/XML
    #32950789
Kama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Та ошибка ушла, но появилась новая:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at org.dom4j.DocumentFactory.createXPath<DocumentFactory.java:196>
..

Установил jaxen-1.0-FCS. Компилирую и запускаю программу с заданием пути к jaxen-dom4j.jar, но все равно эта же ошибка выходит.
Что за капризы?
...
Рейтинг: 0 / 0
задача на Java/XML
    #32950814
Kama
...
java.lang.NoClassDefFoundError: org/jaxen/JaxenException
...
Что за капризы?

значит, не ко всем *.jar'ам пути указал.

PS совет: забить на dom4j и использовать то, что идет в стандартной поставке

PPS за 96 долларов США помогу практически, предоставив готовый продукт
...
Рейтинг: 0 / 0
задача на Java/XML
    #32950908
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рантайм машына Kama
...
java.lang.NoClassDefFoundError: org/jaxen/JaxenException
...
Что за капризы?

значит, не ко всем *.jar'ам пути указал.

PS совет: забить на dom4j и использовать то, что идет в стандартной поставке

PPS за 96 долларов США помогу практически, предоставив готовый продукт
странная цифра :)
...
Рейтинг: 0 / 0
задача на Java/XML
    #32950917
rimanстранная цифра :)
оплата хостинга
...
Рейтинг: 0 / 0
задача на Java/XML
    #32950945
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
цифропояснитель
оплата хостинга
хотел бы тоже контекст какой нить в поле афтара забить, только неохота перелогинивацца, так што: "аааа" (понял, типа). 8)
...
Рейтинг: 0 / 0
задача на Java/XML
    #32951194
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KamaТа ошибка ушла, но появилась новая:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at org.dom4j.DocumentFactory.createXPath<DocumentFactory.java:196>
..

Установил jaxen-1.0-FCS. Компилирую и запускаю программу с заданием пути к jaxen-dom4j.jar, но все равно эта же ошибка выходит.
Что за капризы?

Сейчас текущая версия - dom4j-1.5.2. В архиве с SourceForge в том числе есть два файла - dom4j-1.5.2.jar и jaxen-1.1-beta-4.jar. Если для наглядности положить их в тот же каталог, что и класс, то строки компиляции/запуска будут такими:
Код: plaintext
1.
2.
javac -classpath .;dom4j-1.5.2.jar;jaxen-1.1-beta-4.jar TestSearch.java
java -cp .;dom4j-1.5.2.jar;jaxen-1.1-beta-4.jar TestSearch
...
Рейтинг: 0 / 0
задача на Java/XML
    #32951334
Kama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ, теперь вроде ошибок не дает, но и не находит правильного ответа. Добавляю в условие:
if (node.getText().equals(args[1])) {
System.out.println(node.getPath());
}
код:
else {System.out.println("no such word");}

В запуске программы пишу:
c:\java TestSearch parser.xml 'a'
и он выдает, no such word.
Хотя в xml файле есть это слово.
Вроде условие правильное.
...
Рейтинг: 0 / 0
задача на Java/XML
    #32951350
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А апострофы вокруг значения зачем? Вот я взял xml из твоего первого письма, обозвал его text.xml, в результате:
Код: plaintext
1.
2.
C:\Tmp\dom4j>java -cp .;dom4j-1.5.2.jar;jaxen-1.1-beta-4.jar TestSearch text.xml value1
/a/b/c

То же самое будет, если ты заменишь апострофы на кавычки :
Код: plaintext
1.
2.
C:\Tmp\dom4j>java -cp .;dom4j-1.5.2.jar;jaxen-1.1-beta-4.jar TestSearch text.xml "value2"
/a/b/d
...
Рейтинг: 0 / 0
задача на Java/XML
    #32951445
Kama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось .
Спасибо большое, Денис.
...
Рейтинг: 0 / 0
задача на Java/XML
    #32951455
де нис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не за что. почаще заглядывай сюда :)
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / задача на Java/XML
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]