从网站解析XML到Android设备

4

我正在开发一款Android应用程序,它将解析来自网络的XML数据。我已经创建了几个Android应用程序,但没有涉及过XML解析,想知道大家有没有关于最佳实践的建议?

5个回答

9
这是一个例子:
        try {
            URL url = new URL(/*your xml url*/);
            URLConnection conn = url.openConnection();

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(conn.getInputStream());

            NodeList nodes = doc.getElementsByTagName(/*tag from xml file*/);
            for (int i = 0; i < nodes.getLength(); i++) {
                Element element = (Element) nodes.item(i);
                NodeList title = element.getElementsByTagName(/*item within the tag*/);
                Element line = (Element) title.item(0);
                phoneNumberList.add(line.getTextContent());
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }

在我的例子中,我的XML文件看起来有点像:
<numbers>
   <phone>
      <string name = "phonenumber1">555-555-5555</string>
   </phone>
   <phone>
      <string name = "phonenumber2">555-555-5555</string>
   </phone>
</numbers>

我会将/*xml文件中的标签*/替换为“phone”,将/*标签内的项*/替换为“string”。


这导致我出现了这个错误:https://dev59.com/u2rXa4cB1Zd3GeqPAI_0 - Paolo Falomo
请注意,这必须在后台线程上完成,否则会导致NetworkOnMainThreadException异常。 - Ryan M

1

非常感谢大家,我会尝试一下的。现在是时候去学习DOM和SAX解析了:(笑) - carsey88

1

我总是使用w3c dom类。 我有一个静态帮助方法,用于将xml数据解析为字符串,并返回Document对象。获取xml数据的位置可能会有所不同(网络、文件等),但最终您需要将其作为字符串加载。

类似这样...

    Document document = null;
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder;

    try
    {
        builder = factory.newDocumentBuilder();
        InputSource is = new InputSource(new StringReader(data));
        document = builder.parse(is);
    }
    catch (SAXException e) { }
    catch (IOException e) { }
    catch (ParserConfigurationException e) { }

1

我知道有三种解析类型:DOM、SAX 和 XMLPullParsing。

在我的例子中,你需要URL和XML元素的父节点。

try {
    URL url = new URL("http://www.something.com/something.xml");
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new InputSource(url.openStream()));
    doc.getDocumentElement().normalize();

    NodeList nodeList1 = doc.getElementsByTagName("parent node here");
    for (int i = 0; i < nodeList1.getLength(); i++) {
        Node node = nodeList1.item(i);
    }
} catch(Exception e) {

}

也可以试试this


请注意,这必须在后台线程上完成,否则会导致NetworkOnMainThreadException异常。 - Ryan M

0

我会使用DOM解析器,如果XML文件不太大的话,它并不像SAX那样高效,但在这种情况下更容易。

我只做过一个涉及XML解析的Android应用程序,该应用程序从SOAP Web服务接收XML。我使用了XmlPullParser。Xml.newPullParser()的实现存在一个错误,即nextText()调用并不总是按照文档承诺的那样前进到END_TAG。对此有一种解决方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接