2014-05-14 12 views
6

Hallo ich versuche, eine PLIST-Datei zu analysieren, die Array von dict's enthält. Ich versuche dies mit xmlwise zu tun. Der Inhalt der plistfile ist hereAndroid parse Plist-Datei

Bisher habe ich nur dies in meiner Aktivität und ich bekomme den Inhalt der Plistfile, aber wie den Inhalt in eine Arraylist zu analysieren?

Map<String, Object> properties = null; 
try { 
    InputStream inputStream = getResources().openRawResource(R.raw.first_5); 
    BufferedReader br = null; 
    try { 
     br = new BufferedReader(new InputStreamReader(inputStream)); 
     StringBuilder sb = new StringBuilder(); 
     String line; 
     while ((line = br.readLine()) != null) { 
      sb.append(line); 
     } 
     properties = Plist.fromXml(sb.toString()); 
     // TODO do something with the object here 
     Log.v("--", properties.values() + " " + properties.size()); 
     Log.v("--", "OB "+properties.get()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     br.close(); 
    } 
} 
+2

einen Blick in bestehende lib https://code.google.com/p/plist/source/checkout –

+0

Danke, ich werde es ausprobieren –

Antwort

2

Schnelle Frage. Was sollte der Inhalt der ArrayList sein? Ich frage mich, ob Sie eine Liste von Object in Ihnen Map<String, Object> properties Karte dann zu erwähnen, warum kann man nur die Werte aus der Karte erhalten, wie

Map<String, Object> properties = new HashMap<String, Object>(); 
List<Object> plist = new ArrayList<Object>(properties.values()); 

Abgesehen davon, dass die Überprüfung Ihres plist die Struktur wie ein Wurzelelement Dict ist und eine Liste von Dicts darin. Ich nehme an, Sie müssen das als Liste bekommen. Wenn dies in Betracht gezogen wird, verwenden Sie Android PList parser von longevitysoft. Dies ist einfach und opensource. Es ist im Grunde ein SAXParser Parsing Apple PList.

Sie können dann durch dieses Array iterieren und das entsprechende Objekt abrufen. In der XML-its und Array von Dict-Objekt, so dass Sie so etwas wie dieses

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Paths; 

import com.longevitysoft.android.xml.plist.PListXMLHandler; 
import com.longevitysoft.android.xml.plist.PListXMLParser; 
import com.longevitysoft.android.xml.plist.domain.Array; 
import com.longevitysoft.android.xml.plist.domain.Dict; 
import com.longevitysoft.android.xml.plist.domain.PList; 
import com.longevitysoft.android.xml.plist.domain.PListObject; 

public class PlistReader { 

    public static void main(String[] args) throws Exception { 
     PListXMLParser parser = new PListXMLParser(); 
     PListXMLHandler handler = new PListXMLHandler(); 
     parser.setHandler(handler); 
     parser.parse(readFile("plist.xml")); 
     PList pList = ((PListXMLHandler) parser.getHandler()).getPlist(); 
     Dict root = (Dict) pList.getRootElement(); 
     // This Array class is java.util.ArrayList<PListObject> underneath the 
     // covers 
     Array theList = root.getConfigurationArray("Objects"); 
     for (PListObject obj : theList) { 
      switch (obj.getType()) { 
       case DICT: 
        Dict dictionaryObj = (Dict) obj; 
        // dictionaryObj.getConfigurationObject(key); 
        // dictionaryObj.getConfigurationInteger(key); 
        // dictionaryObj.getConfiguration(key); 
        // dictionaryObj.getConfigurationArray(key) 
        break; 

       case STRING: 
        com.longevitysoft.android.xml.plist.domain.String stringObj = (com.longevitysoft.android.xml.plist.domain.String) obj; 
        break; 

       default: 
        break; 
      } 
     } 
    } 

    private static String readFile(String path) throws IOException { 
     byte[] encoded = Files.readAllBytes(Paths.get(path)); 
     return new String(encoded); 
    } 

} 

tun könnte, als ich versuchte, Ihre XML-Analyse habe ich einige Ausnahme. Das lag daran, dass der PListXMLHandler nach localName und nicht nach qualifiedName gesucht hat. Dies könnte leicht durch Suchen nach localName in startElement() und endElement() Methoden wie behoben werden.

if(isEmpty(localName)){ 
    localName = qName; 
} 

Hoffe, das hilft.

+0

Wo Sie die Pfade Klasse in dieser Zeile erhalten Sie 'Paths.get (Pfad)' –

+0

Oh, das ist ein Eingabestream, jetzt zum Hauptproblem ist, wie kann ich ein Objekt aus diesen Werten erstellen? Kannst du mir auch dabei helfen? –

+0

Entschuldigung. Verpasste diese Frage. Der Code wurde in der Antwort aktualisiert. Sie könnten einfach durch das Objektarray iterieren und dann in den entsprechenden Typ umwandeln und tun, was Sie wollen. Grundsätzlich sind die Typen ARRAY, DATA, DATE, DICT, REAL, INTEGER, STRING, TRUE oder FALSE. Jedes Objekt verfügt also über geeignete Methoden, um Werte von ihnen zu extrahieren. –

0

Sie können auch versuchen Google dd-plist.jar Bibliotheken oder SAXON Parsen für Parsing Plist.

Gehen Sie durch diese Umwandlung:

https://code.google.com/p/plist/wiki/Examples http://developer.android.com/reference/javax/xml/parsers/SAXParser.html

Sie können dd-plist jar, dies zu tun, Download-dd-plist.jar von Google seinen schönen und schnell bedienen.

Ich bin ein Beispiel für die Arbeit von Google Code Colud. Link ist hier. Nehmen http://plist.googlecode.com/svn-history/r61/trunk/src/com/dd/plist/XMLPropertyListParser.java

package com.dd.plist.test; 

import com.dd.plist.*; 
import java.io.File; 
import java.util.Arrays; 
import java.util.Date; 
import junit.framework.TestCase; 

public class ParseTest extends TestCase { 

    /** 
    * Test the xml reader/writer 
    */ 
    public static void testXml() throws Exception { 
     System.out.println(new File("test-files/")); 

     // parse an example plist file 
     NSObject x = PropertyListParser.parse(new File("test-files/test1.plist")); 

     // check the data in it 
     NSDictionary d = (NSDictionary)x; 
     assertTrue(d.count() == 5); 
     assertTrue(((NSString)d.objectForKey("keyA")).toString().equals("valueA")); 
     assertTrue(((NSString)d.objectForKey("key&B")).toString().equals("value&B")); 
     assertTrue(((NSDate)d.objectForKey("date")).getDate().equals(new Date(1322472090000L))); 
     assertTrue(Arrays.equals(((NSData)d.objectForKey("data")).bytes(), 
           new byte[]{0x00,0x00,0x00,0x04,0x10,0x41,0x08,0x20,(byte)0x82})); 
     NSArray a = (NSArray)d.objectForKey("array"); 
     assertTrue(a.count() == 4); 
     assertTrue(a.objectAtIndex(0).equals(new NSNumber(true))); 
     assertTrue(a.objectAtIndex(1).equals(new NSNumber(false))); 
     assertTrue(a.objectAtIndex(2).equals(new NSNumber(87))); 
     assertTrue(a.objectAtIndex(3).equals(new NSNumber(3.14159))); 

     // read/write it, make sure we get the same thing 
     PropertyListParser.saveAsXML(x, new File("test-files/out-testXml.plist")); 
     NSObject y = PropertyListParser.parse(new File("test-files/out-testXml.plist")); 
     assertTrue(x.equals(y)); 
    } 

    /** 
    * Test the binary reader/writer. 
    */ 
    public static void testBinary() throws Exception { 
     NSObject x = PropertyListParser.parse(new File("test-files/test1.plist")); 

     // save and load as binary 
     PropertyListParser.saveAsBinary(x, new File("test-files/out-testBinary.plist")); 
     NSObject y = PropertyListParser.parse(new File("test-files/out-testBinary.plist")); 
     assertTrue(x.equals(y)); 
    } 

    /** 
    * NSSet only occurs in binary property lists, so we have to test it separately. 
    */ 
    public static void testSet() throws Exception { 
     NSSet s = new NSSet(); 
     s.addObject(new NSNumber(1)); 
     s.addObject(new NSNumber(2)); 
     s.addObject(new NSNumber(3)); 

     PropertyListParser.saveAsBinary(s, new File("test-files/out-testSet.plist")); 
     NSObject t = PropertyListParser.parse(new File("test-files/out-testSet.plist")); 
     assertTrue(s.equals(t)); 
    } 

    public static void testASCII() throws Exception { 
     NSObject x = PropertyListParser.parse(new File("test-files/test1-ascii.plist")); 
     NSDictionary d = (NSDictionary)x;   
     assertTrue(d.count() == 5);   
     assertTrue(((NSString)d.objectForKey("keyA")).toString().equals("valueA")); 
     assertTrue(((NSString)d.objectForKey("key&B")).toString().equals("value&B")); 
     assertTrue(((NSDate)d.objectForKey("date")).getDate().equals(new Date(1322472090000L))); 
     assertTrue(Arrays.equals(((NSData)d.objectForKey("data")).bytes(), 
           new byte[]{0x00,0x00,0x00,0x04,0x10,0x41,0x08,0x20,(byte)0x82})); 
     NSArray a = (NSArray)d.objectForKey("array"); 
     assertTrue(a.count() == 4); 
     assertTrue(a.objectAtIndex(0).equals(new NSNumber(true))); 
     assertTrue(a.objectAtIndex(1).equals(new NSNumber(false))); 
     assertTrue(a.objectAtIndex(2).equals(new NSNumber(87))); 
     assertTrue(a.objectAtIndex(3).equals(new NSNumber(3.14159))); 
     NSObject y = PropertyListParser.parse(new File("test-files/test1-ascii-gnustep.plist")); 
     assertTrue(x.equals(y)); 
    } 

    public static void testASCIIWriting() throws Exception { 
     File in = new File("test-files/test1.plist"); 
     File out = new File("test-files/out-test1-ascii.plist"); 
     NSDictionary x = (NSDictionary)PropertyListParser.parse(in); 
     PropertyListParser.saveAsASCII(x, out); 
     NSDictionary y = (NSDictionary)PropertyListParser.parse(out); 
     assertTrue(x.equals(y)); 
    } 

    public static void testGnuStepASCIIWriting() throws Exception { 
     File in = new File("test-files/test1.plist"); 
     File out = new File("test-files/out-test1-ascii-gnustep.plist"); 
     NSDictionary x = (NSDictionary)PropertyListParser.parse(in); 
     PropertyListParser.saveAsGnuStepASCII(x, out); 
     NSObject y = PropertyListParser.parse(out); 
     assertTrue(x.equals(y)); 
    } 
}