powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / DOM парсинг XML
25 сообщений из 28, страница 1 из 2
DOM парсинг XML
    #37925777
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 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
DOM парсинг XML
    #37925977
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NodeList SubnodeList = el.getChildNodes();
...
Рейтинг: 0 / 0
DOM парсинг XML
    #37926002
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лагман,

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

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


вместо for можно
...
Рейтинг: 0 / 0
DOM парсинг XML
    #37926669
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
DOM парсинг XML
    #37926811
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErikI,
у тебя неверный XML. Нет корневого root
...
Рейтинг: 0 / 0
DOM парсинг XML
    #37926858
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErikI,

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

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

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

вот тут например написано:
Код: java
1.
2.
3.
sub = el.getNextSibling();// получить следующего соседа el (если el-первый address  то nextSibling - его след. сосед - второй address)
//при этом el не меняется - вы всегда получаете один и тот же nextSibling
 while(null != sub) // ну тут у нас всегда тот самый сосед, который всегда не нулл
...
Рейтинг: 0 / 0
DOM парсинг XML
    #37927101
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
DOM парсинг XML
    #37927202
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

В примере используется константа /addresses/address, что нет никакой возможности просто дойти до 3 уровня вложенности? Я делал парсил XML в Delphi используя стандартную com библиотеку, там я без проблем мог вызвать несколько раз Child.
...
Рейтинг: 0 / 0
DOM парсинг XML
    #37927275
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
DOM парсинг XML
    #37927289
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErikIчто нет никакой возможности просто дойти до 3 уровня вложенности? Вариантов несколько. Но я предпочитаю этот. Советую прочитать про XPath .
ErikIпарсил XML в Delphi используя стандартную com библиотеку Парсила за Вас та самая com библиотека. А Вы сделали всего лишь обход по узлам (Node'ам). Не путать :)
...
Рейтинг: 0 / 0
DOM парсинг XML
    #37927376
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
DOM парсинг XML
    #37928361
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

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

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

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

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

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

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

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


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