从sdcard解析xml文件

时间:2013-04-03 17:31:29

标签: android xml-parsing android-sdcard

如何从此代码解析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上添加该代码吗?

2 个答案:

答案 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)方法。

选项2:

您也可以直接将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类获得。