Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / задача на Java/XML / 21 сообщений из 21, страница 1 из 1
07.03.2005, 16:13
    #32949637
Kama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
Товарищи, помогите пожалуйста решить задачу. Другу срочно надо. Проблема состоит в следующем:
Дан 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
07.03.2005, 17:14
    #32949673
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
Используя 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
07.03.2005, 17:46
    #32949694
Kama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
Спасибо большое.
Сейчас установлю dom4j.
Еще один вопрос: А можно это сделать посредством Xerces Java Parser ?
...
Рейтинг: 0 / 0
07.03.2005, 18:01
    #32949701
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
Думаю, можно, может быть дополнительно следует воспользоваться Xalan - про него на этой странице сказано, что он работает с XSLT. Т.е. нужно разобрать XML, после чего найти в нем все, что соответствует XSLT-шаблону //*[starts-with(., 'value2')]
...
Рейтинг: 0 / 0
07.03.2005, 19:16
    #32949744
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
на самом деле, достаточно просто получить дерево документа

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

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

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

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

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

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

В том то и дело, что я в этом деле не кумекаю. Можешь, пожалуйста, написать примерно обход "дерева" и как черер java сделать поиск по заданному тексту? Буду премного благодарен.
...
Рейтинг: 0 / 0
08.03.2005, 10:50
    #32949935
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
Примерно так
Код: 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
08.03.2005, 17:03
    #32950104
Kama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
Thnx to NotGonnaGetUs. Прописываю.

Денису Попову: у меня ошибка выходит :(
Exception in thread "main" java.lang.NoClassDefFoundError: org/dom4j/io/DOMReader at TestSearch.main.
Из-за чего может быть? Вроде пути к классам правильно указываю.
...
Рейтинг: 0 / 0
09.03.2005, 00:55
    #32950294
Kama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
Компилирую так:
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
09.03.2005, 09:22
    #32950479
задача на Java/XML
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
09.03.2005, 11:19
    #32950789
Kama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
Та ошибка ушла, но появилась новая:
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
09.03.2005, 11:26
    #32950814
задача на Java/XML
Kama
...
java.lang.NoClassDefFoundError: org/jaxen/JaxenException
...
Что за капризы?

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

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

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

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

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

PPS за 96 долларов США помогу практически, предоставив готовый продукт
странная цифра :)
...
Рейтинг: 0 / 0
09.03.2005, 12:00
    #32950917
задача на Java/XML
rimanстранная цифра :)
оплата хостинга
...
Рейтинг: 0 / 0
09.03.2005, 12:07
    #32950945
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
цифропояснитель
оплата хостинга
хотел бы тоже контекст какой нить в поле афтара забить, только неохота перелогинивацца, так што: "аааа" (понял, типа). 8)
...
Рейтинг: 0 / 0
09.03.2005, 13:29
    #32951194
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
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
09.03.2005, 14:09
    #32951334
Kama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
Спасибо за ответ, теперь вроде ошибок не дает, но и не находит правильного ответа. Добавляю в условие:
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
09.03.2005, 14:16
    #32951350
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
А апострофы вокруг значения зачем? Вот я взял 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
09.03.2005, 15:00
    #32951445
Kama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
Получилось .
Спасибо большое, Денис.
...
Рейтинг: 0 / 0
09.03.2005, 15:04
    #32951455
де нис
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задача на Java/XML
не за что. почаще заглядывай сюда :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / задача на Java/XML / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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