0

私のアプリでは、解析するデータが 50 ~ 100 個あります...サイズが 2 MB 以内の画像もいくつかあります...これらはすべて単一のアクティビティに取得され、そこに並べ替えられて表示されます...

しかし、約2分かかります...それは多すぎます。

解析時間を短縮するにはどうすればよいですか?

または、SAX解析の使用が間違っていますか???提案をお願いします....

SAXParserFactory spf = SAXParserFactory.newInstance();
      SAXParser sp = spf.newSAXParser();
      XMLReader xr = sp.getXMLReader();

      /** Send URL to parse XML Tags */
      URL sourceUrl = new URL(url);

      /** Create handler to handle XML Tags ( extends DefaultHandler ) */
      XmlHandler xmlHandler4Profile = new XmlHandler();
      xr.setContentHandler(xmlHandler4Profile);
      xr.parse(new InputSource(sourceUrl.openStream()));

      } 

XmlHandler.java のコード

public class XmlHandler extends DefaultHandler{
static GetXml getxml;
Boolean currentElement = false;
String currentValue = null;


@Override
public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
currentElement=true;
   if (localName.equals("root"))
    {
        /** Start */ 
       getxml = new GetXml();
    } 
}

@Override
public void endElement(String uri, String localName, String qName)
        throws SAXException {
    // TODO Auto-generated method stub
    currentElement=false;

    //**************************display page************************

    if (localName.equalsIgnoreCase("DisplayId"))
         getxml.setDisplayId(currentValue);     

     if (localName.equalsIgnoreCase("DisplayPage"))
         getxml.setDisplayPage(currentValue);

    //**************************category details************************

        if (localName.equalsIgnoreCase("CategoryId"))
             getxml.setCategoryId(currentValue);        

         if (localName.equalsIgnoreCase("CategoryName"))
             getxml.setCategory(currentValue);

        //**************************news details************************ 

         if (localName.equalsIgnoreCase("Picture"))
             getxml.setPictureName(currentValue);       

         if (localName.equalsIgnoreCase("newsHeading"))
             getxml.setNewsHeading(currentValue);

         if (localName.equalsIgnoreCase("Mainnews"))
             getxml.setMainNews(currentValue);




}
    @Override
public void characters(char[] ch, int start, int length)
        throws SAXException {
    // TODO Auto-generated method stub
     if (currentElement) {
            currentValue = new String(ch, start, length);
            currentElement = false;
        }
}
4

2 に答える 2

3

あなたは本当にあなたのコードをプロファイリングし、それがその時間を費やしている場所を見つけるべきです。

投稿されたコードに、パフォーマンスの問題と正確性の問題が1つずつあります。

elseコードにいくつかの使用法を追加することで、少し利益を得ることができますendElement。何かに一致することがわかったら、localName一致しない可能性のある後のすべての可能性に対してそれをチェックする必要はありません。

それはあまり得られないかもしれませんが、それは確かに試す価値があります。

あなたのcharacters方法は間違っていますが、これは効率ではなく正確さに関係しています。何が間違っているのか、正しいメソッドを作成する方法については、SAX解析に関する別の質問に対する私の回答を参照してくださいcharactersendElementこの変更では、値をバッファに収集する必要があるため、値の取得方法も変更する必要があります。

于 2012-04-09T13:03:58.027 に答える
3

答えは、使用している SAX パーサーがインターネットで xml コンテンツのスキーマまたは DTD をチェックしている可能性があります。これらのチェックをバイパスする entityResolver を作成すると、開始時間 (多くの場合 2 分程度) が改善される可能性があります。

詳しくはこちらをご覧ください。

Javaで整形式のXMLを読み取る方法はありますが、スキーマはスキップしますか?

これにより、Xercesを使用して問題が解決しました...

于 2012-11-15T12:30:44.503 に答える