Получить xml информацию, используя java - PullRequest
0 голосов
/ 27 февраля 2020
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss"><title>USGS All Earthquakes, Past Week</title><updated>2020-02-26T21:28:38Z</updated><author><name>U.S. Geological Survey</name><uri>https://earthquake.usgs.gov/</uri></author><id>https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_week.atom</id><link rel="self" href="https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_week.atom"/><icon>https://earthquake.usgs.gov/favicon.ico</icon>
<entry><id>urn:earthquake-usgs-gov:ci:39084495</id><title>M 0.6 - 13km WNW of Anza, CA</title><updated>2020-02-26T21:23:25.292Z</updated><link rel="alternate" type="text/html" href="https://earthquake.usgs.gov/earthquakes/eventpage/ci39084495"/><summary type="html"><![CDATA[<dl><dt>Time</dt><dd>2020-02-26 21:19:49 UTC</dd><dd>2020-02-26 13:19:49 -08:00 at epicenter</dd><dt>Location</dt><dd>33.602&deg;N 116.804&deg;W</dd><dt>Depth</dt><dd>4.62 km (2.87 mi)</dd></dl>]]></summary><georss:point>33.6016667 -116.8035</georss:point><georss:elev>-4620</georss:elev><category label="Age" term="Past Hour"/><category label="Magnitude" term="Magnitude 0"/><category label="Contributor" term="ci"/><category label="Author" term="ci"/></entry></feed>

Я пытаюсь извлечь информацию из этого xml, мне удалось это сделать, но я не уверен, как это работает, точнее, я не понимаю, почему значение кажется таким глубоким в узлы. код, который я использую, выглядит следующим образом:

            builder = fac.newDocumentBuilder();
            Document doc = builder.parse(source);
            NodeList nodeList = doc.getDocumentElement().getChildNodes();


            for(int i=0;i < nodeList.getLength();i++){
                Node node = nodeList.item(i);
                if (node.getNodeName().equals("entry")){
                    Element element = (Element) node;
                    String nl1 = element.getElementsByTagName("georss:point").item(0).getChildNodes().item(0).getNodeValue();
                }
            }

Я ожидал, что после получения элемента по тегу я смогу сразу получить значение, но вместо этого мне придется go на два уровня глубже, можно кто-нибудь объяснить, почему?

РЕДАКТИРОВАТЬ: опечатка

1 Ответ

0 голосов
/ 28 февраля 2020

Вы спрашиваете, почему это так глубоко вложено. Сначала я отвечу на это, а затем предложу три других подхода, которые вы также можете рассмотреть для работы с xml в java.

Почему оно так вложено

Element.getElementsByTagName() возвращает NodeList, который содержит 0-n элементов. Вы знаете, что у вас есть только один, но xml - нет. Поэтому вам нужно сказать: дайте мне первый элемент этого списка (.item(0)).

Теперь у вас есть элемент point, но вы хотите иметь его содержимое. Вы получаете доступ к контенту как дочерний, но опять же: может быть несколько дочерних элементов (как и другие теги), поэтому вам снова нужно указать, какой элемент.

Альтернативные подходы

  1. Доступ к содержимому в виде текстового содержимого: element.getElementsByTagName("georss:point").item(0).getTextContent();

  2. Использование Xpath:

    XPathFactory xPathfactory = XPathFactory.newInstance(); XPath xpath = xPathfactory.newXPath(); XPathExpression expr = xpath.compile("//*[local-name()='point']"); String evaluate = expr.evaluate(doc); System.out.println(evaluate);

Пожалуйста, обратите внимание, что xpath //*[local-name()='point'] не лучший способ. Вы должны работать с пространствами имен, которые потребуют еще немного кода.

Используйте xml для отображения bean-компонентов, например, с JAXB

Вы должны действительно рассмотреть этот подход, поскольку он в основном позволяет вам иметь объекты Pojo со всем содержимым xml (например, возраст, величина, ...) и просто преобразовать xml в объект, подобный этому:

public class Entry{
    private String id;
    private String title;
    ...
    private String point;
    private String age;
    private String magnitude;
    ...

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...