0

我有一个使用 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);}}};
4

2 回答 2

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);
            }
        }
    };
于 2012-09-05T07:58:19.153 回答
0

这个问题经常出现在 SaxParsing 中。实际的问题是它用“/n”打破了字符串,只有字符串的最后一部分可供我们使用。现在找到解决方案,为标签(包含问题或全部)采用不同的布尔值。

在 startElement 方法中,将相关布尔值设为 true。

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

在 endElemet 方法中使相关的布尔值为 false。

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

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

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

}
于 2012-09-05T07:59:16.107 回答