Android解析plist字符串和整数

Posted

技术标签:

【中文标题】Android解析plist字符串和整数【英文标题】:Android parsing plist strings and integers 【发布时间】:2012-09-02 10:10:11 【问题描述】:

嗨,我正在尝试解析 android 中的 plist,我使用的是 KPBirds plist 解析器的修改版本,可在此处找到 http://kpbird.blogspot.co.uk/2011/08/android-plist-parser.html

问题是我的所有设置都没有错误,但是当我运行它时,它会尝试将字符串解析为整数。例如:名称被设置为字符串,它是通过说名称不能被解析为整数来实现的。

有什么想法吗?

到目前为止,我的代码的工作方式是在我的活动中运行一个函数,该函数获取 plist 的读取,然后对其应用数据模型,然后将其记录在 log cat 中。

这是错误

09-02 10:49:44.717: E/AndroidRuntime(1736): Caused by: java.lang.NumberFormatException: unable to parse 'image1' as integer
09-02 10:49:44.717: E/AndroidRuntime(1736):     at java.lang.Integer.parse(Integer.java:383)
09-02 10:49:44.717: E/AndroidRuntime(1736):     at java.lang.Integer.parseInt(Integer.java:372)
09-02 10:49:44.717: E/AndroidRuntime(1736):     at java.lang.Integer.parseInt(Integer.java:332)
09-02 10:49:44.717: E/AndroidRuntime(1736):     at co.uk.luke.ParsePlist.parsePlist(ParsePlist.java:68)
09-02 10:49:44.717: E/AndroidRuntime(1736):     at co.uk.luke.LevelSelect.readPlistContents(LevelSelect.java:63)
09-02 10:49:44.717: E/AndroidRuntime(1736):     at co.uk.luke.LevelSelect.onCreate(LevelSelect.java:91)
09-02 10:49:44.717: E/AndroidRuntime(1736):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
09-02 10:49:44.717: E/AndroidRuntime(1736):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1785)

这是我调用函数的活动

/// Read plist from Assets
        private String readPlistFromAssets() 
            StringBuffer sb = new StringBuffer();
            BufferedReader br=null;
            try 
                 br = new BufferedReader(new InputStreamReader(getAssets().open("Levels.plist"))); 
                String temp;
                while ((temp = br.readLine()) != null)
                    sb.append(temp);
             catch (IOException e) 
                e.printStackTrace();
             finally 
                try 
                    br.close(); // stop reading
                 catch (IOException ex) 
                    ex.printStackTrace();
                
            
            return sb.toString();
        


        public void readPlistContents()
            // Read Plist content
            String xml = readPlistFromAssets();
            // create object of Parser Class
            ParsePlist pp = new ParsePlist();
            // parse Plist and fill in plist array
            ArrayList<DataModel> plist = pp.parsePlist(xml);
            // Print ArrayList
            Iterator<DataModel> i = plist.iterator();
            while(i.hasNext())
                DataModel d = i.next();
                Log.i("Plist","=========================");
                Log.i("Plist","Levelid = " + d.getLevelid());
                Log.i("Plist","title = " + d.getTitle());
                Log.i("Plist","name = " + d.getName());
                Log.i("Plist","lockStatus = " + d.getLockStatus());
                Log.i("Plist","total = " + d.getTotal());
                Log.i("Plist","totalCompleted = " + d.getTotalCompleted());
                Log.i("Plist","Points = " + d.getPoints());
                Log.i("Plist","Image = " + d.getImage());

            
            Toast.makeText(this, "Parsing completed please check logcat...", Toast.LENGTH_LONG).show();

        

这是我的数据模型

public class DataModel 

    private String title;
    private String name;
    private String levelid;
    private String lockStatus;
    private int total;
    private int totalCompleted;
    private int Points;
    private String Image;


    public int getTotaCompleted() 
        return totalCompleted;
    
    public void setTotalCompleted(int totalCompleted) 
        this.totalCompleted = totalCompleted;
    

    public int getTotal() 
        return total;
    
    public void setTotal(int total) 
        this.total = total;
    

    public int getPoints() 
        return Points;
    
    public void setPoints(int Points) 
        this.Points = Points;
    



    public String getTitle() 
        return title;
    
    public void setTitle(String title) 
        this.title = title;
    

    public String getName() 
        return name;
    
    public void setName(String name) 
        this.name = name;
    
    public String getLevelid() 
        return levelid;
    
    public void setLevelid(String levelid) 
        this.levelid = levelid;
    
    public String getLockStatus() 
        return lockStatus;
    
    public void setLockStatus(String lockStatus) 
        this.lockStatus = lockStatus;
    

    public String getImage() 
        return Image;
    
    public void setImage(String Image) 
        this.Image = Image;
    



这是我解析 plist 的代码

public class ParsePlist 


    // parse Plist and fill in arraylist
    public ArrayList<DataModel> parsePlist(String xml) 
        final ArrayList<DataModel> dataModels = new ArrayList<DataModel>();
        //Get the xml string from assets

        final Document doc = XMLfromString(xml);

        final NodeList nodes_array = doc.getElementsByTagName("array");

        //Fill in the list items from the XML document
        for ( int index = 0; index < nodes_array.getLength(); index++ ) 

            final Node node = nodes_array.item(index);

            if ( node.getNodeType() == Node.ELEMENT_NODE ) 
                final Element e = (Element)nodes_array.item(index);

                final NodeList nodeKey = e.getElementsByTagName("key");
                final NodeList nodeString = e.getElementsByTagName("string");
                DataModel model = new DataModel();

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

                    final Element eleKey = (Element)nodeKey.item(i);
                    final Element eleString = (Element)nodeString.item(i);


                    if ( eleString != null ) 

                        String strValue = getValue(eleString, "string");


                        if(getValue(eleKey, "key").equals("title")) 
                            model = new DataModel();
                            model.setTitle(strValue);

                         else if(getValue(eleKey, "key").equals("name")) 
                            model.setName(strValue);

                         else if(getValue(eleKey, "key").equals("levelid")) 
                            model.setLevelid(strValue); 


                         else if(getValue(eleKey, "key").equals("lockStatus")) 
                            model.setLockStatus(strValue);  

                         else if(getValue(eleKey, "key").equals("total")) 
                            model.setTotal(Integer.parseInt(strValue));

                         else if(getValue(eleKey, "key").equals("totalCompleted")) 
                            model.setTotalCompleted(Integer.parseInt(strValue));


                         else if(getValue(eleKey, "key").equals("Points")) 
                            model.setPoints(Integer.parseInt(strValue));

                         else if(getValue(eleKey, "key").equals("Image")) 
                            model.setImage(strValue);   


                            dataModels.add(model);
                        
                    
                
            
        
        return dataModels;
    

    // Create xml document object from XML String
    private  Document XMLfromString(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) 
            System.out.println("XML parse error: " + e.getMessage());
            return null;
         catch (SAXException e) 
            System.out.println("Wrong XML file structure: " + e.getMessage());
            return null;
         catch (IOException e) 
            System.out.println("I/O exeption: " + e.getMessage());
            return null;
        

        return doc;
    

    // fetch value from Text Node only
    private   String getElementValue(Node elem) 
        Node kid;
        if (elem != null) 
            if (elem.hasChildNodes()) 
                for (kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling()) 
                    if (kid.getNodeType() == Node.TEXT_NODE) 
                        return kid.getNodeValue();
                    
                
            
        
        return "";
    

    /// Fetch value from XML Node
    private   String getValue(Element item, String str) 
        NodeList n = item.getElementsByTagName(str);
        return getElementValue(n.item(0));
    

最后是我的列表

<key>title</key>
        <string>ZONE1</string>
        <key>name</key>
        <string>LEVEL 1</string>
        <key>levelid</key>
        <string>1</string>
        <key>lockStatus</key>
        <string>UNLOCKED</string>
        <key>total</key>
        <integer>20</integer>
        <key>totalCompleted</key>
        <integer>0</integer>
        <key>Points</key>
        <integer>0</integer>
        <key>Image</key>
        <string>image1</string>

【问题讨论】:

【参考方案1】:
 final NodeList nodeKey = e.getElementsByTagName("key");
 final NodeList nodeString = e.getElementsByTagName("string");

添加后

最终节点列表 nodeInteger = e.getElementsByTagName("integer");

在第二个for循环的行之后添加

final Element eleString = (Element)nodeString.item(i);

 final Element eleInteger = (Element)nodeInteger .item(i);

然后检查另一个 if 条件

if ( eleInteger != null ) 

 String strValue = getValue(eleInteger, "integer");


【讨论】:

我是否将它添加到任何地方,因为它目前说 noteInteger 未使用 再一次,我不能只添加它,因为它没有在任何我需要在某处调用 eleinteger 的地方使用

以上是关于Android解析plist字符串和整数的主要内容,如果未能解决你的问题,请参考以下文章

如何读取和解析 plist

Android - 如何正确地将字符串解析为浮点数(价格数字格式:整数、小数或两者兼有)

将 Plist (NSString) 解析为 NSDictionary

Android解析plist到文档

在android中解析一个plist并在列表视图中显示数据

Android解析Plist文件