我正在开发一款Android应用程序,它将解析来自网络的XML数据。我已经创建了几个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();
}
<numbers>
<phone>
<string name = "phonenumber1">555-555-5555</string>
</phone>
<phone>
<string name = "phonenumber2">555-555-5555</string>
</phone>
</numbers>
我会将/*xml文件中的标签*/
替换为“phone”,将/*标签内的项*/
替换为“string”。
现有不同类型的解析机制可用,其中一种是SAX这是一个SAX解析示例,第二种是DOM解析这是一个DOM解析示例。根据您的问题,我们不清楚您需要什么,但这些可能是很好的起点。
我总是使用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) { }
我知道有三种解析类型: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我会使用DOM解析器,如果XML文件不太大的话,它并不像SAX那样高效,但在这种情况下更容易。
我只做过一个涉及XML解析的Android应用程序,该应用程序从SOAP Web服务接收XML。我使用了XmlPullParser。Xml.newPullParser()的实现存在一个错误,即nextText()调用并不总是按照文档承诺的那样前进到END_TAG。对此有一种解决方法。
NetworkOnMainThreadException
异常。 - Ryan M