Android SAXParser剩饭剩菜

时间:2012-09-05 07:45:18

标签: android saxparser duplication

我有一个使用SAXParser解析XML的Android应用。一切顺利,除了一些复制和修剪的文本。例如:“就这样做,即使你不知道怎么做!”变得“不知道怎么做!”

这是DefaultHandler代码。 10倍!

DefaultHandler handler = new DefaultHandler()
    {
        Praise praise;
        String elementValue = null;
        Boolean elementOn = false;

        @Override
        public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException
        {

            if (localName.equals("praise"))
            {
                praise = new Praise();
                elementOn = true;
            }
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException
        {

            // elementOn = false;

            if (localName.equals("PRAISE_TEXT"))
            {
                praise.setPraiseText(elementValue);
            }
            if (localName.equals("MOOD"))
            {
                praise.setMood(elementValue);
            }
            if (localName.equals("RATING"))
            {
                praise.setRating(Integer.valueOf(elementValue));
            }
            if (localName.equals("praise"))
            {
                elementOn = false;
                if (update)
                {
                    if (database.getPraiseByText(praise.getPraiseText(), db) == null)
                    {
                        database.addPraise(db, praise.getPraiseText(), praise.getMood(),
                            Integer.valueOf(praise.getRating()));
                    }
                }
                else
                    database.addPraise(db, praise.getPraiseText(), praise.getMood(),
                        Integer.valueOf(praise.getRating()));
            }
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException
        {
            // StringBuffer b = new StringBuffer();
            if (elementOn)
            {
                elementValue = new String(ch, start, length);}}};

2 个答案:

答案 0 :(得分:0)

在SaxParsing中,您无法保证characters只会被调用一次!

为此,您应该使用相同的元素连接所有收到的字符

这只是您的代码,只需稍加修改即可。您应该使用StringBuilder而不是使用String(:

DefaultHandler handler = new DefaultHandler()
    {
        Praise praise;
        String elementValue = null;
        Boolean elementOn = false;

        @Override
        public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException
        {
            elementValue = new String();

            if (localName.equals("praise"))
            {
                praise = new Praise();
                elementOn = true;
            }
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException
        {
            if (localName.equals("PRAISE_TEXT"))
            {
                praise.setPraiseText(elementValue);
            }
            if (localName.equals("MOOD"))
            {
                praise.setMood(elementValue);
            }
            if (localName.equals("RATING"))
            {
                praise.setRating(Integer.valueOf(elementValue));
            }
            if (localName.equals("praise"))
            {
                elementOn = false;
                if (update)
                {
                    if (database.getPraiseByText(praise.getPraiseText(), db) == null)
                    {
                        database.addPraise(db, praise.getPraiseText(), praise.getMood(),
                            Integer.valueOf(praise.getRating()));
                    }
                }
                else
                    database.addPraise(db, praise.getPraiseText(), praise.getMood(),
                        Integer.valueOf(praise.getRating()));
            }
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException
        {
            // StringBuffer b = new StringBuffer();
            if (elementOn)
            {
                elementValue = elementValue + new String(ch, start, length);
            }
        }
    };

答案 1 :(得分:0)

这个问题经常出现在SaxParsing中。实际问题是它通过“/ n”&和/或只有String的最后一部分可供我们使用。 现在来解决方案,为标签采取不同的布尔值(包含问题或者包含所有问题)。

在startElement方法中make relevent boolean true。

if (localName.equals("PRAISE_TEXT"))
{
  isPrase= true'
  praise.setPraiseText(elementValue);
}
在endElemet方法中,

使相关布尔值为假。

if (localName.equals("PRAISE_TEXT"))
{
  isPrase= false;
  praise.setPraiseText(elementValue);
}

在字符方法中检查布尔值,如下所示:

if(isPrase)
{
 elementValue = new String(ch, start, length);}}};

}