Простой XML-разбор Android - PullRequest
3 голосов
/ 24 января 2012

Я использую следующий веб-сайт для поиска высоты:

http://gisdata.usgs.gov/xmlwebservices2/elevation_service.asmx/getElevation?X_Value=-78.85834070853889&Y_Value=43.869369104504585&Elevation_Units=METERS&Source_Layer=-1&Elevation_Only=true

Это дает результаты в формате 93.7665481567383 в формате XML.

Кто-нибудь знает быстрый и простой способ извлечения этих данных для моей программы для Android?

Я попробовал следующее, но я получаю «ноль» в качестве вывода.

HttpURLConnection connection = null;
URL serverAddress = null;
serverAddress = new URL("http://gisdata.usgs.gov/xmlwebservices2/elevation_service.asmx/getElevation?X_Value=-78.85834070853889&Y_Value=43.869369104504585&Elevation_Units=METERS&Source_Layer=-1&Elevation_Only=true");

connection = null;
connection = (HttpURLConnection)serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setReadTimeout(10000);

connection.connect();
BufferedReader rd  = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
StringBuilder sb = new StringBuilder();

String line = null;
line = rd.readLine();
while ((line = rd.readLine()) != null)
{
    sb.append(line + '\n');
}

Когда я вывожу sb.toString (), я получаю Null

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 25 января 2012

Вы допустили небольшую ошибку:

первый rd.readLine() возвращает ваш <tag>number</tag> материал, но цикл while стирает его с null снова.Удалите первый rd.readLine() звонок, и он должен работать.

String line = null;
line = rd.readLine(); // you get the only line... remove it!
while ((line = rd.readLine()) != null) {
    sb.append(line + '\n');
}

Чтобы получить свой номер, попробуйте использовать что-то вроде этого:

// line should contain your string...
line = line.substring(line.indexOf(">"), line.indexOf("</"));
1 голос
/ 25 января 2012

На самом деле, не пытаясь сделать это самостоятельно, я рекомендую попытаться проанализировать XML, а не пытаться прочитать его из буфера. Чтобы сделать это очень подробно, вам нужно знать древовидную структуру XML, потому что вы будете читать на основе Nodes. Например:

// Data members
private URL URL;
private InputStream stream;
private DocumentBuilder builder;
private Document document;
private Element root;
private NodeList nodeList;

URL = new URL(url); // The URL of the site you posted goes here.
stream = URL.openStream();

// Set up and initialize the document.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setIgnoringElementContentWhitespace(true);
builder = dbf.newDocumentBuilder();
document = builder.parse(stream);
document.getDocumentElement().normalize();

root = document.getDocumentElement();
nodeList = root.getChildNodes();


// The number of calls to 'getFirstChild()' will vary with the complexity of
// your XML tree. Also, 'i' could vary as well, depending on which Node off
// of the root you want to access.
String number = nodeList.item(i).getFirstChild().getFirstChild().getNodeValue();

Это может показаться очень запутанным, но позвольте мне привести пример в XML.

<Building>
    <name>Train Station</name>
    <address>8 Main Street</address>
    <color>Blue</color>
</Building>
<Building>
    <name>Drugstore</name>
    <address>14 Howard Boulevard</address>
    <color>Yellow</color>
</Building>

Каждое здание будет представлять другое значение, передаваемое в качестве параметра .item (i). Чтобы получить доступ к информации о первом Building, передайте значение 0. Доступ к дочерним элементам Building осуществляется с помощью метода .getFirstChild (), но он возвращает только Node. Если вам нужен текст «Аптека», вам нужно будет перейти по дереву XML к данным первого потомка второго элемента, например. nodeList.item(1).getFirstChild().getNodeValue();

Надеюсь, это помогло !!

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