用xml持久化数据,如何实现一个xml阅读器?

Posted

技术标签:

【中文标题】用xml持久化数据,如何实现一个xml阅读器?【英文标题】:Persistent data with xml, how to implement an xml reader? 【发布时间】:2013-01-21 01:29:18 【问题描述】:

我正在尝试使用“内部存储”的方法来保留我的数据。在下面的代码中,我试图将 xml 写入存储。这是正确的方法吗?我正在尝试使用 fileInputStream 打开此文件,但我看到的该类的唯一读取函数是 .read() ,它显然一次读取一个字节的数据。这对于读取 xml 文件似乎很不方便。我应该如何最好地读/写我的数据?

   @Override
    protected void onDestroy() 
        super.onDestroy();
        try 
             FileOutputStream fos=openFileOutput(LOCALSTORAGEFILE,Context.MODE_PRIVATE);
             XmlCreator create=new XmlCreator();
             fos.write(create.subjectListToXml(subjectMasterList).getBytes());
             fos.close();

         catch (IOException ex) 
            Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);     
        

public class XmlCreator 
    XmlSerializer serializer=Xml.newSerializer();
    StringWriter writer=new StringWriter();

    public String subjectListToXml(ArrayList<Subject> masterList)
        try
            serializer.setOutput(writer);
            serializer.startDocument("UTF-8", true);
            serializer.startTag("", "subjects");
            serializer.attribute(null, null, null);
            for(Subject subject:masterList)
                serializer.endTag("","subject");
                for(Cards card:subject.getCards())
                    serializer.startTag("","card");
                     serializer.startTag("","word");
                     serializer.text(card.getCardFront());
                     serializer.endTag("","word");
                    serializer.endTag("", "card");
                
                serializer.endTag("", "subject");
            
                serializer.endTag("","subjects");
                serializer.endDocument();

        catch(Exception e)
            e.printStackTrace();
        
        return writer.toString();
    

【问题讨论】:

你在代码中写了两次serializer.endTag("","subject");,其中一个不应该写startTag吗? 是的,谢谢,错过了。 【参考方案1】:

没有必要重新发明事物。考虑使用SharedPreferences。

如果您仍想使用您的 XML 格式并希望以正确的方式阅读它,这里有一些内容可以帮助您入门:

InputStream is = ...
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);
doc.getDocumentElement().normalize();
NodeList myTags = doc.getElementsByTagName("your_xml_tag");

我还强烈推荐 XML/JSON 库 Jackson 。它只需几行代码就可以读取和保存完整的对象。

【讨论】:

这不能只存储原始类型吗?我正在尝试存储对象 谢谢,我会调查一下 没错,SharedPreferences 不能很好地支持非原始类型,您可以制作一些方法将其包装到字符串/字符串集,但我认为 Jackson 是您正在寻找的。一旦您开始使用 Jackson,您很可能会爱上它!

以上是关于用xml持久化数据,如何实现一个xml阅读器?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用知行之桥EDI系统实现CSV和XML相互转化

如何从另一个域加载 xml 数据

如何根据xml和schema文件生成java类(用程序实现)!

使用XML定制Ribbon的一点小前奏(稍微再进一步的理解XML)

XML文件主要是用啥用的?

如何阅读 PHP 中的第一个 XML 注释?