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

У меня появилась необходимость использования 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
вопрос по XML
    #33549319
BlackWall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В 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
вопрос по XML
    #33549731
Губин Саша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
вопрос по XML
    #33550017
Kudinov Anton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используй jdom, или dom4j
...
Рейтинг: 0 / 0
вопрос по XML
    #33550539
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А СНАЧАЛА прочитайте хотя бы одну приличную книжку про XML.
...
Рейтинг: 0 / 0
вопрос по XML
    #33550542
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Губин СашаМожет конечно это я так коряво написал :-(

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


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