0

作業中のAndroidアプリにSAXパーサーを使用していますが、Projectの名前タグが上書きされないように保存するのに苦労しています。ここでの問題は、タグが同一であるため、プロジェクト内の私の名前タグがライセンス内の名前タグによって上書きされることです。残りは美しく解析されています。また、このxmlはGETリクエストをAPIに渡すことで生成されているため、編集できません。ライセンスフィールド内の名前タグを省略したり、SAXが駆動されているために問題となる、ドキュメント内のどこにいるかを把握しようとする方法はありますか。また、DOMを使用してこれを非常に簡単に達成できることを認識していますが、DOMに切り替えるには遠すぎます。XML処理コードのスニペットと解析しようとしているxmlファイルを添付しました。

ありがとう

@Override
public void startElement (String namespaceURI, String localName, String qName, Attributes attributes) throws SAXException 
{
    buffer.setLength(0);

    if (localName.equalsIgnoreCase("result"))
    {
        results = new ArrayList <Result> ();
    }

    if (localName.equalsIgnoreCase("project"))
    {
        result = new Result ();
    }

    if (localName.equalsIgnoreCase("name"))
    {
        result.name = buffer.toString ();
        Log.v("PROJECT NAME: ", result.name);
    }
} // end of startElement ()

@Override
public void endDocument () throws SAXException
{}

@Override
public void endElement (String namespaceURI, String localName, String qName) throws SAXException
{       
    if (localName.equalsIgnoreCase("project") || localName.equalsIgnoreCase("account"))
    {
            this.entries++;
            results.add(result);
    }

    else if (localName.equalsIgnoreCase("id"))
    {
        result.id = buffer.toString ();
        Log.v("Id: ", result.id);
    }

    else if (localName.equalsIgnoreCase("created_at"))
    {
        try 
        {
            result.date_created = ResultHandlerProject.DATE_FORMAT.parse(buffer.toString());
        } 
        catch (ParseException e) 
        {
            e.printStackTrace();
        }
    }

    else if (localName.equalsIgnoreCase("updated_at"))
    {
        try 
        {
            result.date_updated = ResultHandlerProject.DATE_FORMAT.parse(buffer.toString());
        } 
        catch (ParseException e) 
        {
            e.printStackTrace();
        }
    }

    else if (localName.equalsIgnoreCase("description"))
    {
        result.description = buffer.toString ();
    }

    else if (localName.equalsIgnoreCase("homepage_url"))
    {
        result.url_homepage = buffer.toString ();
    }

    else if (localName.equalsIgnoreCase("download_url"))
    {
        result.url_download = buffer.toString ();
    }

    else if (localName.equalsIgnoreCase("medium_logo_url"))
    {
        result.image_link = buffer.toString ();
    }

    else if (localName.equalsIgnoreCase("user_count"))
    {
        result.user_count = buffer.toString ();
    }

    else if (localName.equalsIgnoreCase("average_rating"))
    {
        result.rating = buffer.toString ();
    }

    else if (localName.equalsIgnoreCase("rating_count"))
    {
        result.rating_count = buffer.toString ();
    }

    else if (localName.equalsIgnoreCase("analysis_id"))
    {
        result.analysis_id = buffer.toString ();
    }

    else if (localName.equalsIgnoreCase("nice_name"))
    {
        result.license_full_name = buffer.toString ();
        Log.v("License Full Name: ", result.license_full_name);
    }

} // end of endElement ()

サンプルXMLファイル:

<result>
<project>
<id>6050</id>
<name>FirePHP</name>
<created_at>2007-06-16T04:03:13Z</created_at>
<updated_at>2012-07-01T15:05:23Z</updated_at>
<description>
FirePHP 
<homepage_url>http://www.firephp.org/</homepage_url>
<download_url>http://www.firephp.org/</download_url>
<url_name>FirePHP</url_name>
<medium_logo_url>
https://s3.amazonaws.com/cloud.ohloh.net/attachments/6638/FirePHP_Large_White_med.png
</medium_logo_url>
<small_logo_url>
https://s3.amazonaws.com/cloud.ohloh.net/attachments/6638/FirePHP_Large_White_small.png
</small_logo_url>
<user_count>145</user_count>
<average_rating>4.11765</average_rating>
<rating_count>34</rating_count>
<analysis_id>8910317</analysis_id>
<licenses>
<license>
<name>bsd</name>
<nice_name>BSD Copyright</nice_name>
</license>
</licenses>
</project> 
4

1 に答える 1

0

簡単な方法で問題を解決できます。

  1. クラスハンドラーにいくつかのフラグを作成します。

    private boolean inProject = false;
    private boolean inLicense = false;
    
  2. 以下に示すように、これらのフラグを制御します。

       @Override
       public void startElement (String namespaceURI, String localName, String qName, Attributes attributes) throws SAXException 
       {
          if (localName.equalsIgnoreCase("project")) {
               this.inProject = true;
          }
          else if (localName.equalsIgnoreCase("license")) {
               this.inLicense = true;
          }
       }
    
       @Override
       public void endElement (String namespaceURI, String localName, String qName) throws SAXException
       {       
           if (localName.equalsIgnoreCase("name") {
               if(inProject) { 
                  //Set your project name here.
                  this.inProject = false;
               }
               else if (inLicense) {
                  //Set your lencense name here.
                  this.inLicense = false;
               }
           }
        }
    

動作するかどうか教えてください。

于 2012-07-13T23:55:20.050 に答える