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

charactersSaxParsingでは、一度だけ呼び出されるという保証はありません。

このためには、受け取るすべての文字を同じ要素で連結する必要があります

これは、わずかな変更を加えた単なるコードです。文字StringBuilder列(:

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 に答える