Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > не могу разобраться с чтением XML из java


Автор: barin_Student 14.3.2012, 08:26
Пример XML файла:
Код

<?xml version="1.0"?>
<gpx version="1.0" creator="NaviTel 5.0.3.70 - http://www.navitel.su" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
  <metadata><time>2012-01-17T13:45:33Z</time></metadata>
  <trk><name>Track 000</name>
    <trkseg>
      <trkpt lat="47.889919" lon="67.547546"><ele>361.000000</ele><time>2012-01-17T07:45:33Z</time><hdop>50.0</hdop><sat>0</sat><fix>2d</fix></trkpt>
      <trkpt lat="47.889919" lon="67.547546"><ele>361.000000</ele><time>2012-01-17T07:45:33Z</time><hdop>50.0</hdop><sat>0</sat><fix>2d</fix></trkpt>
      <trkpt lat="47.889996" lon="67.547432"><ele>361.000000</ele><time>2012-01-17T07:45:36Z</time><hdop>4.4</hdop><sat>0</sat><fix>3d</fix></trkpt>
 </trkseg>
  </trk>
</gpx>


Насколько я понял, root элемент здесь trkpt, мне нужно вытащить данные lat и lon.
Читал здесь: http://forum.vingrad.ru/faq/topic-158003.html + здесь http://translate.google.ru/translate?hl=ru&langpair=en%7Cru&u=http://www.developerfusion.com/code/2064/a-simple-way-to-read-an-xml-file-in-java/ , но примеры однотипные и все данные которые вытаскиваются, они сидят в тегах. Как мне вытащить эти данные? Спасибо. Извиняюсь за такой простой вопрос smile 

Автор: jk1 14.3.2012, 11:23
Код

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("1.xml"));
NodeList list = document.getElementsByTagName("trkpt");
for (int i=0; i< list.getLength(); i++){
    Node node = list.item(i);
    NamedNodeMap map = node.getAttributes();
    System.out.println("lat: " +map.getNamedItem("lat")+ " lon :" + map.getNamedItem("lon"));
}

Автор: barin_Student 14.3.2012, 11:58
Спасибо.
Плюсанул. smile 

Автор: Karadul 27.3.2012, 14:23
jk1, почему бы не воспользоваться foreach?

Код

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("1.xml"));
NodeList list = document.getElementsByTagName("trkpt");
for (Node node : list){
    NamedNodeMap map = node.getAttributes();
    System.out.println("lat: " +map.getNamedItem("lat")+ " lon :" + map.getNamedItem("lon"));
}

Автор: Dummy 27.3.2012, 22:22
Цитата(Karadul @  27.3.2012,  14:23 Найти цитируемый пост)
jk1, почему бы не воспользоваться foreach?

Как минимум потому, что ваш вариант не компилируется. NodeList не расширяет Iterable.

Автор: Karadul 27.3.2012, 23:44
Цитата(Dummy @  27.3.2012,  22:22 Найти цитируемый пост)
NodeList не расширяет Iterable.

Интересно, почему?

Автор: Dummy 28.3.2012, 00:28
Цитата(Karadul @  27.3.2012,  23:44 Найти цитируемый пост)
Интересно, почему? 

Это уже вопрос к разработчикам JAXP. Почему-то DOM API не был адаптирован под плюшки пятой Java.  Тем не менее, есть вполне простое http://www.trevorpounds.com/blog/?p=344 на случай, когда ну очень хочется использовать foreach для итерации по нодам.

Засим предлагаю себе и вам перестать писать в решенной теме, а для последующих вопросов создавать отдельные темы. Спасибо.

Автор: Karadul 28.3.2012, 01:38
Цитата(Dummy @  28.3.2012,  00:28 Найти цитируемый пост)
Почему-то DOM API не был адаптирован под плюшки пятой Java.

Совсем некуда спешить? smile
Хотя стоп. А почему NodeList не List?

Цитата(Dummy @  28.3.2012,  00:28 Найти цитируемый пост)
Засим предлагаю себе и вам перестать писать в решенной теме, а для последующих вопросов создавать отдельные темы. Спасибо. 

Да ну, создавать отдельную тему для вопроса "а почему оно не поддерживает апи 10-летней давности?".

Автор: jk1 28.3.2012, 07:53
Цитата

The Java Collections API is insufficiently type-safe. Although you can design a List subclass that only allows particular types of objects, all nodes for example, there’s no way to indicate this in the subclass’s API. All the List methods merely return and take as arguments objects of type Object. (Yes, starting in Java 1.5 generics are possible. However, not only am I unwilling to limit API to Java 1.5 and later. There are a number of compromises made in Java' 1.5's generics implementation for reasons of backwards compatibility that limit its type safety.)


С этим архитектурным решением можно спорить конечно, зато мотивация авторов становится понятной.

Модератор: Пожалуйста, один топик - один вопрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)