Как извлечь все данные из XML-документа с использованием XMLPullParser и как сохранить их для распределения по двум действиям - PullRequest
0 голосов
/ 02 января 2019

[Вот скриншот DetailActivity && Вот скриншот основной активности ] [1] Я пытаюсь проанализировать документ XML, используя xmlPullParserи распределить полученные данные по двум действиям:

  • MainActivity: включает в себя 3 свойства
  • DetailActivity: включает в себя все остальные данные.

У меня два вопроса:

  1. Как проанализировать все теги и получить их данные в XML-документе , используя xmlPullParser.
  2. Как отображать данные DetailActiviy при каждом нажатии на RecyclerView элемент .

Я пытался разобрать xml-документ дважды.Один раз для основных данных и второй для дополнительных данных, которые мне нужны для детального действия: либо дважды открыть соединение (обойти, но слишком плохо), либо сохранить полученные данные в списке и вернуть два новых конструктора вместо одного (списокбольше не отображается).

Вот мой MainActivity:

public class MainActivity extends AppCompatActivity implements AdsAdapter.AdsAdapterOnClickHandler
{


    public static final String URL = "DISPLAYED BELOW";
       private static final String TAG = MainActivity.class.getSimpleName();
       public static List entries = new ArrayList<>();
       private RecyclerView mRecyclerView;
       private AdsAdapter mAdsAdapter;


@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview_ad);

    int recyclerViewOrientation = LinearLayoutManager.VERTICAL;

    boolean shouldReverseLayout = false;
    LinearLayoutManager layoutManager
            = new LinearLayoutManager(this, recyclerViewOrientation, shouldReverseLayout);
    mRecyclerView.setLayoutManager(layoutManager);

    mRecyclerView.setHasFixedSize(true);

    mAdsAdapter = new AdsAdapter(this);

    mRecyclerView.setAdapter(mAdsAdapter);
    loadPage();
}


public void loadPage() {
    new DownloadXmlTask().execute(URL);
    System.out.print("Result" + "Succeed");
}

private class DownloadXmlTask extends AsyncTask<String, Void, List<AdEntry>>
{
    @Override
    protected List<AdEntry> doInBackground(String... urls)
    {
        try
        {
            return loadXmlFromNetwork(urls[0]);
        }
        catch (IOException e)
        {
            return null;
        }
        catch (XmlPullParserException e)
        {
            return null;
        }
    }

    @Override
    protected void onPostExecute(List<AdEntry> adEntries)
    {
        Toast.makeText(MainActivity.this, "Successfully Processed", Toast.LENGTH_SHORT).show();
        System.out.println("Successfully Processed");
        mAdsAdapter.setAdData(adEntries);
        super.onPostExecute(adEntries);
    }
}

public List<AdEntry> loadXmlFromNetwork(String urlString) throws XmlPullParserException, IOException {
    InputStream stream = null;
    try
    {
        stream = downloadUrl(urlString);
        entries = parse(stream);
    }
    finally
    {
        if (stream != null)
            stream.close();
    }
    System.out.println("FinalDataResult" + entries);
    return entries;
}

public InputStream downloadUrl(String urlString) throws IOException
{
    URL url = new URL(urlString);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setReadTimeout(10000 /* milliseconds */);
    conn.setConnectTimeout(15000 /* milliseconds */);
    conn.setRequestMethod("GET");
    conn.setDoInput(true);
    conn.connect();
    return conn.getInputStream();
}

@Override
public void onClick(AdEntry ad)
{
    Context context = this;
    Class destinationClass = DetailActivity.class;
    Intent intentToStartDetailActivity = new Intent(context, destinationClass);
    intentToStartDetailActivity.putExtra("Product Name",ad.productName);
    intentToStartDetailActivity.putExtra("Product Thumbnail", ad.productThumbnail);;
    startActivity(intentToStartDetailActivity);
}

}

Вот мой XMLPullParser:

public class AdXmlParser {
private static final String ns = null;

public static List parse(InputStream in) throws XmlPullParserException, IOException {
    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(in, null);
        parser.nextTag();
        return readAds(parser);
    } finally {
        in.close();
    }
}

public static List detailParse(InputStream in) throws XmlPullParserException, IOException {
    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(in, null);
        parser.nextTag();
        return readExtras(parser);
    } finally {
        in.close();
    }
}

private static List readAds(XmlPullParser parser) throws XmlPullParserException, IOException {
    List<AdEntry> entries = new ArrayList();

    parser.require(XmlPullParser.START_TAG, ns, "ads");

    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG)
            continue;

        String name = parser.getName();
        if (name.equals("ad"))
            entries.add(readEntry(parser));
        else
            skip(parser);
    }

    System.out.println("entries" + entries);
    return entries;
}

private static List<AdEntry> readExtras(XmlPullParser parser) throws XmlPullParserException, IOException {
    List<AdEntry> extras = new ArrayList();

    parser.require(XmlPullParser.START_TAG, ns, "ads");
    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();
        if (name.equals("ad")) {
            extras.add(readExtraData(parser));
        } else {
            skip(parser);
        }
    }
    return extras;
}

private static AdEntry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, ns, "ad");
    String productName = null;
    String productThumbnail = null;
    String rating = null;

    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG)
            continue;

        String name = parser.getName();
        switch (name) {
            case "productName":
                productName = readNameProduct(parser);
                System.out.println("productName" + productName);
                break;
            case "productThumbnail":
                productThumbnail = readThumbnail(parser);
                System.out.println("productThumbnail" + productThumbnail);
                break;
            case "rating":
                rating = readRating(parser);
                System.out.println("rating" + rating);
                break;
            default:
                skip(parser);
                break;
        }
    }
    return new AdEntry(productName, productThumbnail, rating);
}

private static AdEntry readExtraData(XmlPullParser parser) throws XmlPullParserException, IOException {
    parser.require(XmlPullParser.START_TAG, ns, "ad");
    String averageRatingImageURL = null;
    String numberOfRatings = null;
    String categoryName = null;
    String appId = null;
    String productDescription = null;
    String clickProxyURL = null;

    while (parser.next() != XmlPullParser.END_TAG) {
        if (parser.getEventType() != XmlPullParser.START_TAG)
            continue;

        String name = parser.getName();
        if (name.equals("averageRatingImageURL")) {
            averageRatingImageURL = readRating(parser);
            System.out.println("rating" + averageRatingImageURL);
        } else if (name.equals("numberOfRatings")) {
            numberOfRatings = readNumberOfRatings(parser);
            System.out.println("numberOfRatings" + numberOfRatings);
        } else if (name.equals("categoryName")) {
            categoryName = readCategoryName(parser);
            System.out.println("categoryName" + categoryName);
        } else if (name.equals("appId")) {
            appId = readAppId(parser);
            System.out.println("appId" + appId);
        } else if (name.equals("productDescription")) {
            productDescription = readProductDescription(parser);
            System.out.println("productDescription" + productDescription);
        } else if (name.equals("clickProxyURL")) {
            productDescription = readProxyLink(parser);
            System.out.println("clickProxyURL" + clickProxyURL);
        } else
            skip(parser);
    }

    return new AdEntry(averageRatingImageURL, productDescription, categoryName, numberOfRatings, appId, clickProxyURL);
}

private static String readProxyLink(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, ns, "clickProxyURL");
    String clickProxyURL = readText(parser);
    parser.require(XmlPullParser.END_TAG, ns, "clickProxyURL");
    return clickProxyURL;
}

private static String readProductDescription(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, ns, "productDescription");
    String productDescription = readText(parser);
    parser.require(XmlPullParser.END_TAG, ns, "productDescription");
    return productDescription;
}

private static String readAppId(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, ns, "appId");
    String appId = readText(parser);
    parser.require(XmlPullParser.END_TAG, ns, "appId");
    return appId;
}


private static String readNameProduct(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, ns, "productName");
    String productName = readText(parser);
    parser.require(XmlPullParser.END_TAG, ns, "productName");
    return productName;
}

private static String readThumbnail(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, ns, "productThumbnail");
    String productThumbnail = readText(parser);
    parser.require(XmlPullParser.END_TAG, ns, "productThumbnail");
    return productThumbnail;
}

private static String readNumberOfRatings(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, ns, "numberOfRatings");
    String numberOfRatings = readText(parser);
    parser.require(XmlPullParser.END_TAG, ns, "numberOfRatings");
    return numberOfRatings;
}

private static String readCategoryName(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, ns, "categoryName");
    String numberOfRatings = readText(parser);
    parser.require(XmlPullParser.END_TAG, ns, "categoryName");
    return numberOfRatings;
}


private static String readRating(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, ns, "rating");
    String rating = readText(parser);
    parser.require(XmlPullParser.END_TAG, ns, "rating");
    return rating;
}

private static String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
    String result = "";
    if (parser.next() == XmlPullParser.TEXT) {
        result = parser.getText();
        parser.nextTag();
    }

    return result;
}

private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
    if (parser.getEventType() != XmlPullParser.START_TAG)
        throw new IllegalStateException();

    int depth = 1;
    while (depth != 0) {
        switch (parser.next()) {
            case XmlPullParser.END_TAG:
                depth--;
                break;
            case XmlPullParser.START_TAG:
                depth++;
                break;
        }
    }
}

}

Вотмой адаптер:

public class AdsAdapter extends RecyclerView.Adapter<AdsAdapter.AdsAdapterViewHolder> {

final private AdsAdapterOnClickHandler mClickHandler;
public TextView thumbnail_textView;
public TextView name_textView;
public TextView rating_textView;
private List<AdEntry> mAdData;


public AdsAdapter(AdsAdapterOnClickHandler clickHandler) {
    mClickHandler = clickHandler;
}

@Override
public AdsAdapterViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    Context context = viewGroup.getContext();
    int layoutIdForListItem = R.layout.ad_list_item;
    LayoutInflater inflater = LayoutInflater.from(context);
    boolean shouldAttachToParentImmediately = false;

    View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
    return new AdsAdapterViewHolder(view);
}

@Override
public void onBindViewHolder(AdsAdapterViewHolder adsAdapterViewHolder, int position) {
    AdEntry ad_item = mAdData.get(position);

    String thumbnail = ad_item.getProductThumbnail();
    name_textView.setText(thumbnail);

    String productName = ad_item.getProductName();
    thumbnail_textView.setText(productName);

    String productRating = ad_item.getProductRating();
    rating_textView.setText(productRating);

}

@Override
public int getItemCount() {
    if (null == mAdData) return 0;
    return mAdData.size();
}

public void setAdData(List<AdEntry> adData) {
    mAdData = adData;
    System.out.println("mAdData Result" + mAdData);
    notifyDataSetChanged();
}

public interface AdsAdapterOnClickHandler {
    void onClick(AdEntry ad);
}

public class AdsAdapterViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public AdsAdapterViewHolder(View view) {
        super(view);

        thumbnail_textView = (TextView) view.findViewById(R.id.detail_product_thumbnail);
        name_textView = (TextView)view.findViewById(R.id.product_name);
        rating_textView = (TextView)view.findViewById(R.id.product_rating);


        view.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int adapterPosition = getAdapterPosition();
        AdEntry ad = mAdData.get(adapterPosition);
        mClickHandler.onClick(ad);
    }
}

}

Вот XML-документ, который я пытаюсь проанализировать:

<ad>
<appId>com.zynga.ozmatch</appId>
<averageRatingImageURL>
https://cdn1.appia.com/cdn/adpub/appwallv1/rated-5-5.png
</averageRatingImageURL>
<bidRate>0.000</bidRate>
<billingTypeId>1</billingTypeId>
<callToAction>Install Now</callToAction>
<campaignDisplayOrder>1</campaignDisplayOrder>
<campaignId>24058</campaignId>
<campaignTypeId>2</campaignTypeId>
<categoryName>Puzzle</categoryName>
<clickProxyURL>
http://prlds.appia.com/v2/preloadAd.jsp?siteId=10777&deviceId=4230&spotId=&sessionId=techtestsession&campaignId=24058&creativeId=483970&packageName=com.zynga.ozmatch&fulfillmentTypeId=1&placementId=&campaignDisplayOrder=1&enc=true&ts=1680f0e88d8&algorithmId=-4&partner=154&homeScreen=false
</clickProxyURL>
<creativeId>483970</creativeId>
<homeScreen>false</homeScreen>
<impressionTrackingURL>
https://imps.appia.com/v2/impressionAd.jsp?siteId=10777&campaignId=24058&creativeId=483970&campaignDisplayOrder=1&ts=1680f0e88d8&sessionId=techtestsession&packageName=com.zynga.ozmatch&enc=true&eventGroupId=EVTGID1546440837284181712958668&algorithmId=-4&partner=154
</impressionTrackingURL>
<isRandomPick>false</isRandomPick>
<numberOfRatings>10,000+</numberOfRatings>
<productDescription>
Match your way to meet the wonderful Wizard of Oz in this amazing puzzle adventure!
</productDescription>
<productId>15338</productId>
<productName>Wizard of Oz: Magic Match</productName>
<productThumbnail>
https://prod-static-images.s3.amazonaws.com/shared/creatives/15338/1385be772f424a3cb42cd8f07747b05b.png
</productThumbnail>
<rating>5.0</rating>
</ad>

Вот моя модель Класс:

public class AdEntry {

    public String productThumbnail;
    public String productName;
    public String productRating ;
    public String productDescription;
    public String productCategory;
    public String numberOfRatings;
    public  String appId;
    public String proxyLink;
    public String averageRatingImageURL;

    public AdEntry(String productThumbnail, String productName, String productRating) {
        this.productThumbnail = productThumbnail;
        this.productName = productName;
        this.productRating = productRating;
    }

    public AdEntry(String productRating, String productDescription, String productCategory, String numberOfRatings, String appId, String proxyLink){
        this.productRating = productRating;
        this.productDescription = productDescription;
        this.productCategory = productCategory;
        this.numberOfRatings = numberOfRatings;
        this.appId = appId;
        this.proxyLink = proxyLink;
    }
public String getProductThumbnail() {
        return productThumbnail;
    }

    public String getProductName() {
        return productName;
    }

    public String getProductRating() {
        return productRating;
    }

    public String getProductDescription() {
        return productDescription;
    }

    public String getProductCategory() {
        return productCategory;
    }

    public String getNumberOfRatings() {
        return numberOfRatings;
    }

    public String getAppId() {
        return appId;
    }

    public String getProxyLink() {
        return proxyLink;
    }

    public String getAverageRatingImageURL() {
        return averageRatingImageURL;
    }
}

Вот здесь DetailActivity:

public class DetailActivity extends AppCompatActivity {

    private static List<AdEntry> entries = new ArrayList<>();
    public TextView description_textView;
    public TextView category_textView;
    public TextView rating_textView;
    public TextView link_textView;
    public TextView numberOfRating_textView;
    public TextView name_textView;
    public TextView thumbnail_textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);


        name_textView = (TextView)findViewById(R.id.detail_product_name);
        thumbnail_textView = (TextView)findViewById(R.id.detail_product_thumbnail);

        retrieveData();
    }

    public void retrieveData() {
        String productName =  getIntent().getStringExtra("Product Name");
        String productThumbnail = getIntent().getStringExtra("Product Thumbnail");
        System.out.println("productThumbnail Result" + productThumbnail);
        thumbnail_textView.setText(productThumbnail);
        name_textView.setText(productName);

    }
...