如何从此代码解析xml文件。代码正在从URL工作,但我需要从sdcard解析xml文件。 我添加了从sdcard写入和读取的权限。
Code :
menuItems = new ArrayList<HashMap<String, String>>();
final XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
// looping through all item nodes <item>
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
map.put(KEY_COST, "Datum: " + parser.getValue(e, KEY_COST));
map.put(KEY_DESC, parser.getValue(e, KEY_DESC));
map.put(KEY_LINK, parser.getValue(e, KEY_LINK));
map.put(KEY_LINK1, parser.getValue(e, KEY_LINK1));
// adding HashList to ArrayList
menuItems.add(map);
}
XMLClass:
public String getXmlFromUrl(String url) {
String xml = null;
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// return XML
return xml;
}
/**
* Getting XML DOM element
* @param XML string
* */
public Document getDomElement(String xml){
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xml));
doc = db.parse(is);
} catch (ParserConfigurationException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (SAXException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (IOException e) {
Log.e("Error: ", e.getMessage());
return null;
}
return doc;
}
/** Getting node value
* @param elem element
*/
public final String getElementValue( Node elem ) {
Node child;
if( elem != null){
if (elem.hasChildNodes()){
for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
if( child.getNodeType() == Node.TEXT_NODE ){
return child.getNodeValue();
}
}
}
}
return "";
}
/**
* Getting node value
* @param Element node
* @param key string
* */
public String getValue(Element item, String str) {
NodeList n = item.getElementsByTagName(str);
return this.getElementValue(n.item(0));
}
}
我需要编辑什么? sdcard上文件夹的位置是“/sdcard/.Folder/”。 我可以在XMLClass上添加该代码吗?
答案 0 :(得分:1)
我需要编辑什么? sdcard上文件夹的位置是“/sdcard/.Folder/”。 我可以在XMLClass上添加该代码吗?
这是我的第一个想法。
由于您的源文件位于手机中,因此您可以使用HttpClient
删除所有工作,因为您不需要它。然后,您需要读取您的文件并将其内容分配给String。我建议使用StringBuffer来提高效率。要获取外部存储路径,您应该使用提供正确方法的Enviroment类。
<强>的伪代码:强>
public String getXmlFromFile(String filename) {
StringBuffer buff = new StringBuffer();
File root = Environment.getExternalStorageDirectory();
File xml = new File(root, "pathToYourFile");
BufferedReader reader = new BufferedReader(new FileReader(xml));
String line = null;
while ((line = reader.readLine()) != null) {
buff.append(line).append("\n");
}
reader.close();
return buff.toString();
}
现在你在内存中有XML
字符串,你可以将它传递给getDomElement(String xml)
方法。
您也可以直接将File
分配到DocumentBuilder
<强>的伪代码:强>
Document doc = null;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
File root = Environment.getExternalStorageDirectory();
File xmlFile = new File(root, "pathToYourFile");
doc = builder.parse(xmlFile);
return doc;
您也可以使用parse()
函数raw InputStream
的参数。
答案 1 :(得分:0)
您可以使用XmlPullParser
类和.setInput(bufferedReader)
方法来读取文件。路径通过Environment
类获得。