RSS / XML парсинг - PullRequest
       62

RSS / XML парсинг

0 голосов
/ 14 июля 2020

Я застрял при попытке проанализировать и отобразить данные RSS-канала. Как мне легко получить эти ссылки на все работы? Какую библиотеку использовать. Спасибо! В настоящее время используется мобильное приложение https://pub.dev/packages/webfeed DART / Flutter

Невозможно проанализировать и отобразить ссылки ниже: https://academic.oup.com/rss/site_5267/3133.xml (возвращает 405) https://journals.lww.com/co-anesthesiology/_layouts/15/OAKS.Journals/feed.aspx?FeedType=MostPopularArticles (не загружается и не импортируется xml)

Работает ли эта ссылка: http://anesthesiology.pubs.asahq.org/rss/site_157/173.xml

import 'dart:io';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:wcm_anes/common/circularIndicator.dart';
import 'package:wcm_anes/customIcons/custom_icons_icons.dart';
import 'package:wcm_anes/styles/colorAsset.dart';
import 'package:wcm_anes/styles/stringAssets.dart';
import 'package:wcm_anes/styles/textStyles.dart';
import 'package:webfeed/webfeed.dart';
import 'package:http/http.dart' as http;
import 'package:url_launcher/url_launcher.dart';


class RssUrlListScreen extends StatefulWidget {


  String screenName;
  String feedUrl;
  String categoryId;

  RssUrlListScreen({this.screenName,this.feedUrl,this.categoryId});

  @override
  _RssUrlListScreenState createState() => _RssUrlListScreenState();
}

class _RssUrlListScreenState extends State<RssUrlListScreen> {


  static const String loadingMessage = 'Loading Feed...';
  static const String feedLoadErrorMessage = 'Error Loading Feed.';
  static const String feedOpenErrorMessage = 'Error Opening Feed.';


  String _title;
  RssFeed feed;
    bool isLoading = false;


  updateTitle(title) {
    setState(() {
      _title = title;
    });
  }

  updateFeed(feed) {
    setState(() {
      feed = feed;
    });
  }

  Future<void> openFeed(String url) async {
    if (await canLaunch(url)) {
      await launch(
        url,
        forceSafariVC: true,
        forceWebView: false,
      );
      return;
    }
    updateTitle(feedOpenErrorMessage);
  }

  // Method to load the RSS data.
  load() async {
    updateTitle(loadingMessage);
    loadFeed().then((result) {
      if (result == null || result.toString().isEmpty) {
        // Notify user of error.
        updateTitle(feedLoadErrorMessage);
        return;
      }

      setState(() {
        feed = result;
        isLoading = false;
      });
    });
  }

  // Method to get the RSS data
  Future<RssFeed> loadFeed() async {
    try {
      final client = http.Client();
        final response = await client.get(widget.feedUrl);
        print("responssssurl>> ${response.body}");
        return RssFeed.parse(utf8.decode(response.bodyBytes));

    } catch (e) {
      print("execption>> $e");
      // handle any exceptions here
    }
    return null;
  }


  @override
  void initState() {
    updateTitle(widget.screenName);
    isLoading = true;
    load();
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomPadding: false,
      appBar: AppBar(
        brightness: Platform.isIOS?Brightness.light:Brightness.dark,
        title:feed != null?Text(feed.title,style:headerTextStyle):Container(),
        leading: IconButton(
            onPressed: (){
              Navigator.pop(context);
            },
            icon:Icon(Icons.arrow_back_ios,color: ColorAsset.tabColorGray,size:20.0,)),
        backgroundColor: Colors.white,
        elevation: 0.0,
        titleSpacing: 0.0,
        centerTitle: true,
      ),
      body: Stack(
        children: <Widget>[
           feed != null?
            feed.items.length>0?ListView.builder(
               physics: new ClampingScrollPhysics(),
               itemCount: feed.items.length,
               itemBuilder: (BuildContext context, int index){
                 final feedItems = feed.items[index];
                 print("rssTitle>>> ${feedItems.title}");
                 return Container(
                   margin: EdgeInsets.only(left:13.0,right:13.0),
                   child: Center(
                     child: Card(
                       elevation: 1.0,
                       child: ListTile(
                         onTap: (){
                           openFeed(feedItems.link);
                         },
                         title: Text(feedItems.title,style:listTextStyle),
                         subtitle: Text(feedItems.pubDate,style: subCategoroyTextStyle,),
                         contentPadding: EdgeInsets.all(5.0),
                         trailing: Padding(
                           padding: EdgeInsets.only(top:15.0,bottom:15.0),
                           child: Icon(CustomIcons.next,size:20.0,),
                         )
                       ),
                     ),
                   ),
                 );
               }
           ):Container(
              margin: EdgeInsets.only(top:(MediaQuery.of(context).size.height/2)-110),
              child:  Text(StringAssets.noData,
              style: listTextStyle,
              ),
            )
          :Container(),
          Visibility(
              visible: isLoading,
            child: Container(
              //margin: EdgeInsets.only(top:(MediaQuery.of(context).size.height/2)-110),
              child: Center(
                  child: CircularIndiacator()
              ),
            ),
          )
        ],
      ),
    );
  }
}
...