如何在Android中从Sdcard解析XML文件

8

I've got this xml:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
  <alllogs count="5">
    <log number="+919876543210" time="1365589432804" date="Wed Apr 10 15:53:52 GMT+05:30 2013" type="2" duration="0" new="1" name="360 chhotein" numbertype="2" numberlabel="null" />
    <log number="+919876543210" time="1365595887261" date="Wed Apr 10 17:41:27 GMT+05:30 2013" type="2" duration="0" new="1" name="360 chhotein" numbertype="2" numberlabel="null" />
    <log number="+919876543210" time="1365596387590" date="Wed Apr 10 17:49:47 GMT+05:30 2013" type="2" duration="0" new="1" name="360 chhotein" numbertype="2" numberlabel="null" />
    <log number="+919876543210" time="1365596787051" date="Wed Apr 10 17:56:27 GMT+05:30 2013" type="2" duration="0" new="1" name="null" numbertype="null" numberlabel="null" />
    <log number="0041786095382" time="1365740469738" date="Fri Apr 12 09:51:09 GMT+05:30 2013" type="2" duration="0" new="1" name="null" numbertype="null" numberlabel="null" />
  </alllogs>

我使用的解析器是Android本地的XMLPullParser。

我无法更改XML格式,但如果值得的话,我可以使用另一个与Android兼容的解析器。

如果不清楚,它必须适合像这样的类:

try {
        String file = Environment.getExternalStorageDirectory() + File.separator + "SmsContactsBackup/logs/calllogs_20130412125502.xml";
         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
         factory.setNamespaceAware(true);
         XmlPullParser parser = factory.newPullParser();
         FileInputStream fis = new FileInputStream(file);
         parser.setInput(new InputStreamReader(fis));
         Log.d("Response", ""+convertStreamToString(fis));
         int eventType = parser.getEventType();
         String name = null;
         while (eventType != XmlPullParser.END_DOCUMENT)
         {
             //String name = parser.getName();

             if(eventType == XmlPullParser.START_DOCUMENT) {
                 System.out.println("Start document");
             }else if(eventType == XmlPullParser.START_TAG) {
                 name = parser.getName();
                 if (name.equalsIgnoreCase("alllogs")){
                     count = Integer.parseInt(parser.getAttributeValue("", "count"));
                }else if(name.equalsIgnoreCase("log"))
                {
                    phone_no.add(parser.getAttributeValue("", "number"));
                }
                 System.out.println("Start tag "+parser.getName());
             }else if(eventType == XmlPullParser.END_TAG) {
                 name = parser.getName();
                 System.out.println("End tag "+parser.getName());
             }
             eventType = parser.next();
         }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

事件类型不正确,且发生了输入输出异常。


异常信息显示了什么? - Egor
@Egor,我刚刚解决了异常问题,但是在循环和事件类型方面出现了问题。我得到了事件类型的值4,但无法获取任何标签。同时,在parse.getName()中也存在问题。有时它会给我一个名称,而其他时间则显示为空。如果您熟悉这种解析,请帮助我。我已经尝试了两天。 - Rupal Thanki
3个回答

4

最终我得到了这样的解决方案,我使用了Dom解析。

public class MainActivity extends Activity {

    ArrayList<String> mImageLink;
    ArrayList<String> phone_no;
    int count;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         mImageLink = new ArrayList<String>();
         phone_no = new ArrayList<String>();

         try {
         File file = new File("mnt/sdcard/Backup_Apps/call_logs/calllog_35777569.xml");
         InputStream is = new FileInputStream(file.getPath());
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         DocumentBuilder db = dbf.newDocumentBuilder();
         Document doc = db.parse(new InputSource(is));
         doc.getDocumentElement().normalize();

         NodeList nodeList = doc.getElementsByTagName("alllogs");

         for (int i = 0; i < nodeList.getLength(); i++) {

             Node node = nodeList.item(i);

             Element fstElmnt = (Element) node;

             mImageLink.add(fstElmnt.getAttribute("count"));
             count = Integer.parseInt(mImageLink.get(i));

         }
         NodeList n = doc.getElementsByTagName("log");

         for (int j = 0; j < count; j++) {
             Node node = n.item(j);

             Element fstElmnt = (Element) node;

             phone_no.add(fstElmnt.getAttribute("number"));

        }
     } catch (Exception e) {
         System.out.println("XML Pasing Excpetion = " + e);
     }
 }
}

0
try {
            File SDCardRoot = Environment.getExternalStorageDirectory()
                    .getAbsoluteFile();
            File myDir = new File(SDCardRoot.getAbsolutePath() + "/.ABC"
                    + "/.Config");

            File file = new File(myDir, "config.xml");

            InputStream inputSource = new FileInputStream(file.getPath());
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(inputSource);
            Element element = doc.getDocumentElement();
            element.normalize();
            NodeList nList = doc.getElementsByTagName("item");
            for (int i = 0; i < nList.getLength(); i++) {
                Node node = nList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) node;
                    String id = eElement.getElementsByTagName("id").item(0)
                            .getTextContent();
                    eElement.getElementsByTagName("name").item(0)
                            .getTextContent();
                    eElement.getElementsByTagName("image_updated").item(0)
                            .getTextContent();
                    eElement.getElementsByTagName("image").item(0)
                            .getTextContent();
                    eElement.getElementsByTagName("colorcode").item(0)
                            .getTextContent();
                }
            }
        } catch (Exception e) {
            e.printStackTrace(); 
        }

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接