Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / DOM парсинг XML / 25 сообщений из 28, страница 1 из 2
22.08.2012, 10:43:42
    #37925777
ErikI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
Есть XML:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  <?xml version="1.0" encoding="UTF-8" ?> 
- <addresses>
- <address ID="1">
  <country>Eestonia</country> 
  <city>Tallinn</city> 
  <street>Karlamarksa st. 1</street> 
  </address>
- <address ID="2">
  <country>Eestonia</country> 
  <city>Tallinn</city> 
  <street>Karlamarksa st. 2</street> 
  </address>
- <address ID="3">
  <country>Eestonia</country> 
  <city>Tallinn</city> 
  <street>Karlamarksa st. 3</street> 
  </address>
  </addresses>



Хочу пройти начиная с рута до последнего ребенка.
Делаю так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    public Document parserXML(File file) throws SAXException, IOException, ParserConfigurationException
    {  return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);  }
                Document doc = parserXML(new File(Name));
                doc.getDocumentElement().normalize();
                Element Root = doc.getDocumentElement();
//А вот как дальше идти по веткам не знаю получилось только по address, пробовал так 
                Node el = Root.getFirstChild();
                do
                {
                    System.out.println(el.getNodeName()+": "); //+ el.getTextContent());
                    NodeList SubnodeList = Root.getChildNodes();
                    for (int j = 0; j < SubnodeList.getLength(); j++)
                    {
                        Node node = SubnodeList.item(j);
                        System.out.println(node.getNodeName()+": "); //+ el.getTextContent());
                    };
                    el=el.getNextSibling();
                } while(el!=null);


Как в этой модели добратся до элементов address country city?
...
Рейтинг: 0 / 0
22.08.2012, 12:01:49
    #37925977
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
NodeList SubnodeList = el.getChildNodes();
...
Рейтинг: 0 / 0
22.08.2012, 12:10:54
    #37926002
ErikI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
Лагман,

el.getChildNodes не дает дочерний элемент если хочу спустится на 2 уровня. То есть пройти могу только из addresses в address и все.
...
Рейтинг: 0 / 0
22.08.2012, 12:17:00
    #37926017
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
ErikI,

У вас там написано Root .getChildNodes();, получается что Вы вместо детей элемента опять перебираете детей корневого элемента.
...
Рейтинг: 0 / 0
22.08.2012, 13:24:57
    #37926176
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
ErikI
Код: java
1.
getNextSibling


вместо for можно
...
Рейтинг: 0 / 0
22.08.2012, 16:23:50
    #37926669
ErikI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
Petro123,

Пробовал заменять for на:
Код: java
1.
2.
3.
4.
5.
                    do
                    {
                        sub = el.getNextSibling();
                        System.out.println(sub.getNodeName()+": "); //+ el.getTextContent());
                    } while(null != sub);


Получаю только ress: address
...
Рейтинг: 0 / 0
22.08.2012, 17:22:35
    #37926811
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
ErikI,
у тебя неверный XML. Нет корневого root
...
Рейтинг: 0 / 0
22.08.2012, 17:39:12
    #37926858
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
ErikI,

А это точно не зацикливается?
ErikI
Код: java
1.
2.
3.
4.
 {
                        sub = el.getNextSibling();
                        System.out.println(sub.getNodeName()+": "); //+ el.getTextContent());
                    } while(null != sub)
...
Рейтинг: 0 / 0
22.08.2012, 17:52:28
    #37926888
ErikI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
Лагман,

Точно, что зацикливается! Но как пройтись по элементам я так и не понял.
...
Рейтинг: 0 / 0
22.08.2012, 18:02:06
    #37926918
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
ErikI,

Ну вам надо повнимательнее прочитать свой код и документацию к методам

вот тут например написано:
Код: java
1.
2.
3.
sub = el.getNextSibling();// получить следующего соседа el (если el-первый address  то nextSibling - его след. сосед - второй address)
//при этом el не меняется - вы всегда получаете один и тот же nextSibling
 while(null != sub) // ну тут у нас всегда тот самый сосед, который всегда не нулл
...
Рейтинг: 0 / 0
22.08.2012, 21:17:44
    #37927101
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
ErikI,
Возможное решение
Код: 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.
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
import org.xml.sax.*;

@SuppressWarnings("serial") class Address extends HashMap<String, String> { }
@SuppressWarnings("serial") class Addresses extends ArrayList<Address> { }

class MyXmlParser {
    private String xmlString;
    private Addresses addresses = null;
    
    public MyXmlParser(String xmlString) {
	this.xmlString = xmlString;
    }
    
    public Document getDocument() throws SAXException, IOException, ParserConfigurationException {
	return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(xmlString)));
    }
    
    public Addresses getAddresses() throws XPathExpressionException, SAXException, IOException, ParserConfigurationException {
	XPath xp = XPathFactory.newInstance().newXPath();
	NodeList nodes = (NodeList)xp.evaluate("/addresses/address", getDocument().getDocumentElement(), XPathConstants.NODESET);
	addresses = new Addresses();
	
	for (int i = 0; i < nodes.getLength(); i++) {
	    Address address = new Address();
	    for (int j = 0; j < nodes.item(i).getChildNodes().getLength(); j++) {
		address.put(nodes.item(i).getChildNodes().item(j).getNodeName(), 
			nodes.item(i).getChildNodes().item(j).getTextContent());
	    }
	    addresses.add(address);
	}

	return addresses;
    }

    public static void main(String[] args) throws Exception {
	String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><addresses>....</addresses>";
	MyXmlParser mxr = new MyXmlParser(xmlStr);
	for (Address a: mxr.getAddresses()) {
	    for (String key: a.keySet()) {
		System.out.format("address[%s] = %s", key, a.get(key));
	    	System.out.println();
	    }
	    System.out.println();
	}
    }
}


...
Рейтинг: 0 / 0
22.08.2012, 23:46:17
    #37927202
ErikI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
Usman,

В примере используется константа /addresses/address, что нет никакой возможности просто дойти до 3 уровня вложенности? Я делал парсил XML в Delphi используя стандартную com библиотеку, там я без проблем мог вызвать несколько раз Child.
...
Рейтинг: 0 / 0
23.08.2012, 02:25:36
    #37927275
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
ErikI,

Тащемта, здесь тоже самое только вы методы и переменные путаете.

Выглядеть будет как-то так (не проверял)

Код: java
1.
2.
3.
4.
5.
6.
7.
for (Node address = root.getFirstChild(); address!=null; address= address.getNextSibling() )

for (Node countryCityStreet = address.getFirstChild(); countryCityStreet !=null; countryCityStreet = countryCityStreet .getNextSibling() )

}

}



А вообще если это не учебные развлечения, посмотрите xpath, там путь к узлу можно указывать.
...
Рейтинг: 0 / 0
23.08.2012, 03:44:46
    #37927289
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
ErikIчто нет никакой возможности просто дойти до 3 уровня вложенности? Вариантов несколько. Но я предпочитаю этот. Советую прочитать про XPath .
ErikIпарсил XML в Delphi используя стандартную com библиотеку Парсила за Вас та самая com библиотека. А Вы сделали всего лишь обход по узлам (Node'ам). Не путать :)
...
Рейтинг: 0 / 0
23.08.2012, 08:47:13
    #37927376
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
ErikI,

Отличное решение. (Десериализация)
Код: 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.
import java.io.StringReader;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.*;

@XmlRootElement(name="addresses")
class Addresses {
    private List<Address> addresses;
    public Addresses() { }
    public List<Address> getAddresses() { return addresses; }
    @XmlElement(name="address") 
    public void setAddresses(List<Address> addresses) { this.addresses = addresses; }
}

@XmlRootElement(name="address")
@XmlType(propOrder = {"country", "city", "street"})
class Address {
    @XmlAttribute(name="ID")
    public String id;
    public String country; 
    public String city;
    public String street;
    public Address() { }
}

public class Main {
    public static void main(String[] args) throws Exception {
	String input = "<?xml...</addresses>";
	JAXBContext context = JAXBContext.newInstance(Addresses.class);
	Unmarshaller unmarshaller = context.createUnmarshaller();
	
	Addresses aa = new Addresses();
	aa = (Addresses)unmarshaller.unmarshal(new StringReader(input));
	for (Address a: aa.getAddresses()) {
	    System.out.format("[%s](%s, %s, %s)\n", a.id, a.country, a.city, a.street);
	}
    }
}


...
Рейтинг: 0 / 0
23.08.2012, 16:59:20
    #37928361
ErikI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
Usman,

Может быть ваше решение мне подойдет, надо подумать. Только у меня это не единственный фаил. Если еще 2 таких же, структура у них одинакова, но поля называются по другому. Можите уточнить для чего служат эти определния:

Код: java
1.
2.
@XmlRootElement(name="address")
@XmlType(propOrder = {"country", "city", "street"})
...
Рейтинг: 0 / 0
23.08.2012, 17:11:48
    #37928394
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
ErikIЕсть XML:

Хочу пройти начиная с рута до последнего ребенка.

Как в этой модели добратся до элементов address country city?
Документ - типичная плоская реплика таблицы из базы.
Тебе здесь DOM вообще не нужен. DOM-это тяжёлая артиллерия. Его применяют
когда нужна корректировка и сохранение или еще что-то в проивозльном порядке.
Для твоей задачи достаточно использовать javax.xml.stream.XMLInputFactory
и javax.xml.stream.XMLStreamReader. Примеров использования - много.
...
Рейтинг: 0 / 0
23.08.2012, 17:20:32
    #37928421
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
ErikIЕсли еще 2 таких же, структура у них одинакова, но поля называются по другому. Если структура у них одинаковая, то достаточно изменить поле name в аннотациях ErikIМожите уточнить для чего служат эти определния @XmlRootElement(name="address") - Аннотация "Корневой элемент" (который может быть и узлом) с именем <address>
@XmlType(propOrder = {"country", "city", "street"}) - Указание порядка следования свойств (узлов)

P.S.
За подробностями в документацию
...
Рейтинг: 0 / 0
23.08.2012, 17:52:50
    #37928498
ErikI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
Лагман,

Двумя циклами удалось получить все необходимые данные. Фактически я пишу первую программу на java, так что извините за бестолковые вопросы.
Сейчас я часто получаю из getNodeName #text Конечно я могу просто тупо поставть if и если переменная текст то пропускать. Есть более правильное решение? Пробовал rec.getNodeType() == Node.ELEMENT_NODE, но она дает истину на элементах #text.
...
Рейтинг: 0 / 0
23.08.2012, 18:08:16
    #37928542
ErikI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
И еще одна странность вызываю функцию getNodeValue получаю всегда NULL хотя в XML значения указаны.
...
Рейтинг: 0 / 0
23.08.2012, 18:15:15
    #37928554
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
Есть такая клвая штука в java, называется дебаггер, всем советую
...
Рейтинг: 0 / 0
23.08.2012, 18:21:16
    #37928566
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
забыл никЕсть такая клвая штука в java, называется дебаггер, всем советую
Есть ещё много всяких штук которые автору предстоит для себя открыть. Среди них нормальные браузеры, нормальные DOM API парсеры (jdom, dom4j) и ещё более нормальные не DOM парсеры (StAX, Digester).
...
Рейтинг: 0 / 0
23.08.2012, 18:24:21
    #37928568
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
Blazkowiczзабыл никЕсть такая клвая штука в java, называется дебаггер, всем советую
Есть ещё много всяких штук которые автору предстоит для себя открыть. Среди них нормальные браузеры, нормальные DOM API парсеры (jdom, dom4j) и ещё более нормальные не DOM парсеры (StAX, Digester).
Ну я с вами соглашусь, но не все же сразу. Для начинающего ваши слова выглядят как минимум как заклинание, а то еще того хуже - ругательством!
...
Рейтинг: 0 / 0
23.08.2012, 18:27:19
    #37928572
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
забыл никНу я с вами соглашусь, но не все же сразу. Для начинающего ваши слова выглядят как минимум как заклинание, а то еще того хуже - ругательством!
Когда я был начинающим я слегка попух от того как выглядит родной DOM API и в первую очередь переключится на JDOM. А уже во вторую очередь на Digester, когда входящие файлы выросли до 20Мб.
...
Рейтинг: 0 / 0
23.08.2012, 19:11:38
    #37928621
ErikI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DOM парсинг XML
забыл ник,

Да дебагер штука хорошая, особенно если ориентируешся в предмете, тут он мне не особо помог. Я хотел найти простейший способ вытащить информацию из XML. Даже рефлексию сделал, но в java опыт нулевой, тем более в ней просто море технологий. А всего то хотелось пройти по узлам вытащить значения, имен узлов и получит 1 атрибут. Но сделать хотел универсально, мне тут много чего советовали и десериализация и JDOM с Digester. Все это правильно но надо доделать 1 вариант.
Я что совсем не правильно делаю когда пытаюсь получить Value?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / DOM парсинг XML / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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