【发布时间】:2012-02-12 10:10:49
【问题描述】:
我正在启动一个从网络解析 XML 的 Android 应用程序。我已经创建了一些 Android 应用程序,但它们从未涉及解析 XML,我想知道是否有人对最好的方法有任何提示?
【问题讨论】:
我正在启动一个从网络解析 XML 的 Android 应用程序。我已经创建了一些 Android 应用程序,但它们从未涉及解析 XML,我想知道是否有人对最好的方法有任何提示?
【问题讨论】:
这是一个例子:
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>
我会将/*tag from xml file*/ 替换为“电话”,将/*item within the tag*/ 替换为“字符串”。
【讨论】:
NetworkOnMainThreadException。
我总是使用 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) { }
【讨论】:
解析机制有很多种,一种是SAXHere is SAX parsing example,第二种是DOM解析Here is DOM Parsing example.。从您的问题来看,您并不清楚您想要什么,但这些可能是很好的起点。
【讨论】:
我知道三种类型的解析:DOM、SAX 和 XMLPullParsing。
在我的示例中,您需要 XML 元素的 URL 和父节点。
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。
我会使用 DOM 解析器,它不如 SAX 高效,如果 XML 文件不太大,因为在这种情况下更容易。
我只制作了一个涉及 XML 解析的 Android 应用程序。从 SOAP Web 服务接收的 XML。我使用了 XmlPullParser。 Xml.newPullParser() 的实现有一个错误,即对 nextText() 的调用并不总是像文档所承诺的那样前进到 END_TAG。有一个解决方法。
【讨论】: