2014-05-14 7 views
6

हैलो मैं एक प्लेलिस्ट फ़ाइल को पार्स करने की कोशिश कर रहा हूं जिसमें dict की सरणी है। मैं xmlwise का उपयोग कर ऐसा करने की कोशिश कर रहा हूं। Plistfile की सामग्री hereएंड्रॉइड पार्स प्लास्ट फ़ाइल

अभी तक मेरे पास केवल मेरी गतिविधि में है और मुझे plistfile की सामग्री मिल रही है, लेकिन सामग्री को एक सरणी में कैसे पार्स करना है?

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

में मौजूदा lib https://code.google.com/p/plist/source/checkout –

+0

धन्यवाद एक नजर डालें, मैं इसे बाहर की जाँच करेंगे –

उत्तर

2

त्वरित प्रश्न। ArrayList की सामग्री क्या होनी चाहिए? मैं अगर आप आप में Object की एक सूची के बारे में उल्लेख कर रहे हैं सोच रहा था Map<String, Object> properties नक्शा तो क्यों नहीं कर सकते आप बस के रूप में

Map<String, Object> properties = new HashMap<String, Object>(); 
List<Object> plist = new ArrayList<Object>(properties.values()); 
कि आपके plist जाँच संरचना एक Dict मूल तत्व की तरह है से

अलावा और नक्शे से मूल्यों को प्राप्त इसमें डिक्ट्स की एक सूची। मुझे लगता है कि आपको इसे एक सूची के रूप में प्राप्त करने की आवश्यकता है। यदि ऐसा है तो longevitysoft द्वारा Android PList parser का उपयोग करने पर विचार करें। यह सरल और opensource है। इसका मूल रूप से एक SAXParser पार्सिंग Apple PList है।

फिर आप इस सरणी के माध्यम से फिर से शुरू कर सकते हैं और वस्तु को मंजूरी दे सकते हैं। अपने xml अपने और Dict वस्तु की सरणी, में आप जब मैं अपने xml पार्स करने की कोशिश की मैं कुछ अपवाद हो गया इस

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); 
    } 

} 

की तरह कुछ कर सकता है तो। ऐसा इसलिए था क्योंकि PListXMLHandler स्थानीय नाम की जांच कर रहा था और योग्य नाम नहीं था। इसे startNlement() और endElement() विधियों जैसे स्थानीय नाम की जांच करके आसानी से तय किया जा सकता है।

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

उम्मीद है कि इससे मदद मिलती है।

+0

कहाँ आप इस लाइन में पथ वर्ग मिलता है 'Paths.get (पथ)' –

+0

ओह कि यह एक इनपुट स्ट्रीम है, अब मुख्य मुद्दा यह है कि मैं उन मानों से ऑब्जेक्ट कैसे बना सकता हूं? क्या आप भी इसके साथ मेरी मदद कर सकते हैं? –

+0

क्षमा करें। इस सवाल को याद किया। उत्तर में कोड अपडेट किया गया। आप ऑब्जेक्ट की सरणी के माध्यम से फिर से सक्रिय हो सकते हैं, फिर इसे उचित प्रकार पर डालें और जो कुछ भी आप चाहते हैं उसे करें। असल में प्रकार ARRAY, डेटा, DATE, DICT, REAL, INTEGER, STRING, TRUE या FALSE होंगे। तो प्रत्येक ऑब्जेक्ट में उनके द्वारा मूल्य निकालने के लिए उचित तरीके हैं। –

0

आप पार्सिंग प्लिस्ट के लिए Google dd-plist.jar लाइब्रेरी या सैक्सन पार्स भी आजमा सकते हैं।

इस रूपांतरण के माध्यम से जाओ:

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

आप अपनी अच्छी और तेज गूगल से इस, डाउनलोड dd-plist.jar करने के लिए dd-plist जार उपयोग कर सकते हैं।

मैं Google कोड कोलड से मेरे लिए काम कर रहा एक उदाहरण डाल रहा हूं। लिंक यहां है। 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)); 
    } 
} 
संबंधित मुद्दे