0

基本上,我正在创建一个 android 游戏,并希望将一些关卡数据保存在一个 XML 文件中,这些数据保存在 assets 文件夹中,我将它们解析为:

final SAXParserFactory spf = SAXParserFactory.newInstance();
final SAXParser sp = spf.newSAXParser();
final XMLReader xmlReader = sp.getXMLReader();
final XMLParser pXMLParser = new XMLParser();//My own created Class
xmlReader.setContentHandler(pXMLParser);
InputStream inputStream = Z.act.getAssets().open("levels/" + PackName + ".xml");
xmlReader.parse(new InputSource(new BufferedInputStream(inputStream)));
return pXMLParser.getParsedLevel();

在那之前一切正常,我成功地创建并保存了 XML 文件。但也不算多,我还想创建一个关卡编辑器。我能够通过使用类似的东西来创建 XML(在 String 数据类型中)

(根据关卡编辑器活动/场景的调用,在不同的方法中有各种“String +=”):

String XMLString = "";
XMLString += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
....
XMLString += " </" + tagEnemy + ">"; // tagEnemy is a variable string I created

我现在很困惑如果这是正确的或者我应该如何以 XML 形式(或任何方便的形式)动态创建它以及保存位置(可能是 android 中的内部或外部存储)应该是最好的。因为我尝试了许多代码片段在谷歌上找到很多东西之后我的大部分代码可能没用而且不起作用,但如果你说我可以添加它。谢谢你的帮助。

4

1 回答 1

1

试试我的代码,它从资产/网址解析数据

public class SaxParserTest extends DefaultHandler {
    Boolean currentElement = false;
    String currentValue = null;
    ArrayList<HashMap<String, Object>> datalist = new ArrayList<HashMap<String, Object>>();
    HashMap<String, Object> temp;
    public ArrayList<HashMap<String, Object>> getData(Context context ){
        try {
            SAXParserFactory saxparser = SAXParserFactory.newInstance();
            SAXParser parser = saxparser.newSAXParser();
            XMLReader xmlReader = parser.getXMLReader();
            xmlReader.setContentHandler(SaxParserTest.this);
            /*
             * used when pick local data
             */
//              InputStream is =context.getAssets().open("data.xml");
//              xmlReader.parse(new InputSource(is));
            /*
             * used when pick data from url
             */
            URL url = new URL("http://www.xmlfiles.com/examples/cd_catalog.xml");
            xmlReader.parse(new InputSource(url.openStream()));     
        } catch (Exception e) {
            e.getMessage();
        }
        return datalist;
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        if (localName.equalsIgnoreCase("CD")) {
            temp=new HashMap<String, Object>();
            temp.put(Constant.id, attributes.getValue(Constant.id));
//          temp.put(Constant.title, attributes.getValue(Constant.title));
//          temp.put(Constant.artist, attributes.getValue(Constant.artist));
//          temp.put(Constant.country, attributes.getValue(Constant.country));
//          temp.put(Constant.company, attributes.getValue(Constant.company));
//          temp.put(Constant.price, attributes.getValue(Constant.price));
//          temp.put(Constant.year, attributes.getValue(Constant.year));
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        super.characters(ch, start, length);
            currentValue = new String(ch, start, length);
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        super.endElement(uri, localName, qName);
        if(localName.equals(Constant.title))
        temp.put(Constant.title, currentValue);
        if(localName.equals(Constant.artist))
        temp.put(Constant.artist, currentValue);
        if(localName.equals(Constant.country))
        temp.put(Constant.country, currentValue);
        if(localName.equals(Constant.company))
        temp.put(Constant.company, currentValue);
        if(localName.equals(Constant.price))
        temp.put(Constant.price, currentValue);
        if(localName.equals(Constant.year))
        temp.put(Constant.year, currentValue);
        if(localName.equalsIgnoreCase("CD"))
            datalist.add(temp);
        Log.i("DataList", datalist.toString());

    }
}

并像这样使用它

SaxParserTest test=new SaxParserTest();
            datal=test.getData(this);
            SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, datal,
                    R.layout.activity_main, new String[] { Constant.title,
                            Constant.artist, Constant.price, Constant.year,
                            Constant.company, Constant.country ,Constant.id}, new int[] {
                            R.id.txt1, R.id.txt2, R.id.txt3, R.id.txt4,
                            R.id.txt5, R.id.txt6 ,R.id.txt7});
            setListAdapter(adapter);
于 2013-04-13T05:29:17.300 回答