0

如何从此代码解析 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);

            }

XML类:

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 上添加该代码吗?

4

2 回答 2

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:

你也可以直接分配你FileDocumentBuilder

伪代码:

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()函数 rawInputStream的参数。

于 2013-04-03T18:10:32.850 回答
0

您可以使用XmlPullParser类和.setInput(bufferedReader)方法来读取文件。路径通过Environment类获取。

于 2013-04-03T19:17:09.213 回答