Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос по XML / 6 сообщений из 6, страница 1 из 1
16.02.2006, 12:23
    #33548673
Губин Саша
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по XML
Здравствуйте!

У меня появилась необходимость использования XML. Я нашел пример его использования в инете, но почему то ожидаемого результата я так и не получил :-( Подскажите пожалуйста, что я делаю не так :-(

Вот пример XML:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?xml version="1.0"?>
<!DOCTYPE library
[
<!ELEMENT library (book)+> 
<!ELEMENT book (title, autor, published)> 
<!ELEMENT title (#PCDATA)> 
<!ELEMENT autor (#PCDATA)> 
<!ELEMENT published (#PCDATA)> 
<!ATTLIST book id CDATA #REQUIRED> 
]>
<library> 
	<book id = "1">
		<title>DDDDDDDDD</title>
		<autor>AAAAAAAAA</autor>
		<published>XXXXXXXXX</published>
	</book> 
	<book id = "2">
		<title>ZZZZZZZZZ</title>
		<autor>QQQQQQQQQ</autor>
		<published>RRRRRRRRR</published>
	</book> 
</library> 
А это текст моей тестовой программы:
Код: 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.
 import  java.io.FileInputStream;
 import  org.w3c.dom.*;
 import  org.apache.crimson.tree.XmlDocument;
//import com.sun.
 public   class  TestXML {
     public   static   void  main(String argv[]){
        FileInputStream fis;
        Document doc;
        Element root;
        Node n;
         try {
            fis =  new  FileInputStream("c:\\temp\\JAVA\\TestXML\\src\\sample.xml");
            doc = XmlDocument.createXmlDocument(fis, true);
            root = doc.getDocumentElement();
            NodeList nl = doc.getElementsByTagName("book");
             if (nl.getLength() ==  0 )  return ;
             for  ( int  i= 0 ; i<nl.getLength(); i++){
                n = nl.item(i);
                NamedNodeMap nnm = n.getAttributes();
                System.out.println("\n #" + nnm.item( 0 ).getNodeValue());
                System.out.println("\n len " + n.getChildNodes().toString());
                 if (n.hasChildNodes()){
                    NodeList nlTemp = n.getChildNodes();
                    System.out.println("Title: " + nlTemp.item( 0 ).getNodeValue());
                    System.out.println("Autor: " + nlTemp.item( 1 ).getNodeValue());
                    System.out.println("Published: " + nlTemp.item( 2 ).getNodeValue() + "---\n");
                }

            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
В результате на консоль выводится значение id, а вот до значения заключенного между тегами title, autor, published я достучаться не могу :-(

Заранее всем большое спасибо за помощь ;-)
...
Рейтинг: 0 / 0
16.02.2006, 15:05
    #33549319
BlackWall
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по XML
В NodeList попадают также текстовые узла и комментарии. Поэтому ты должен либо обойти все дочерние элементы возвращенные getChildNodes() с проверкой getNodeType()==Node.ELEMENT_NODE и имени, либо использовать XPath (что проще).
Сделал себе объект XMLObject для обмена данными и добавил такие методы:

public String getString(Node node, String xpath) throws TransformerException {
return XPathAPI.eval(node, "string(" + xpath + ")").str();
}

public Node getNode(Node node, String xpath) throws TransformerException {
return XPathAPI.selectSingleNode(node, xpath);
}

public NodeList getNodeList(Node node, String xpath) throws TransformerException {
return XPathAPI.selectNodeList(node, xpath);
}

Тебе нужно добавить импорт
import org.apache.xpath.XPathAPI;
и включить в проект XPath процессор xalan.jar

PS. DTD уже устарела, поэтому везде где можно использую W3C Schema ввиду ее бОльших возможностей по описанию и ограничению структуры документа.
...
Рейтинг: 0 / 0
16.02.2006, 16:30
    #33549731
Губин Саша
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по XML
BlackWallВ NodeList попадают также текстовые узла и комментарии. Поэтому ты должен либо обойти все дочерние элементы возвращенные getChildNodes() с проверкой getNodeType()==Node.ELEMENT_NODE и имени, либо использовать XPath (что проще).


Спасибо, получилось, правда как то коряво это все выглядет :-(

System.out.println("Title: " + nlTemp.item(1).getChildNodes().item(0).getNodeValue());
System.out.println("Autor: " + nlTemp.item(3).getChildNodes().item(0).getNodeValue());
System.out.println("Published: " + nlTemp.item(5).getChildNodes().item(0).getNodeValue());

Может конечно это я так коряво написал :-(
...
Рейтинг: 0 / 0
16.02.2006, 17:43
    #33550017
Kudinov Anton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по XML
используй jdom, или dom4j
...
Рейтинг: 0 / 0
16.02.2006, 22:05
    #33550539
М.Голованов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по XML
А СНАЧАЛА прочитайте хотя бы одну приличную книжку про XML.
...
Рейтинг: 0 / 0
16.02.2006, 22:09
    #33550542
М.Голованов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по XML
Губин СашаМожет конечно это я так коряво написал :-(

Если вы ограничиваетесь непосредственной навигацией по дереву, лучше вряд ли выйдет. Однако есть инструменты, существенно снижающие "корявость" кода. О них опять-таки можно почитать в умной книжке (например, http://]http://www.ibiblio.org/xml/books/xmljava/ - ну ОЧЕНЬ советую.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / вопрос по XML / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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