Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SAX的Android XML解析_Android_Xml_Parsing_Sax - Fatal编程技术网

使用SAX的Android XML解析

使用SAX的Android XML解析,android,xml,parsing,sax,Android,Xml,Parsing,Sax,我正在尝试解析此xml: <exchangerate> <exchangerate ccy="AMD" ccy_name_ru="Армянский драм " ccy_name_ua="Вiрменський драм " ccy_name_en="Armenian Dram " base_ccy="RU" buy="805393" unit="1000.00000" date="2014.01.09"/> <exchangerate ccy="AUD" ccy

我正在尝试解析此xml:

<exchangerate>
<exchangerate ccy="AMD" ccy_name_ru="Армянский драм " ccy_name_ua="Вiрменський драм " ccy_name_en="Armenian Dram " base_ccy="RU" buy="805393" unit="1000.00000" date="2014.01.09"/>
<exchangerate ccy="AUD" ccy_name_ru="Австралийский доллар " ccy_name_ua="Австралiйський долар " ccy_name_en="Australian Dollar " base_ccy="RU" buy="291544" unit="1.00000" date="2014.01.09"/>
</exchangerate>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
<channel>
<atom:link href="http://dengi-banki-kredit.webnode.ru/rss/novosti.xml" rel="self" type="application/rss+xml"/>
<title>
<![CDATA[ Новости - dengi-banki-kredit.webnode.ru ]]>
</title>
<link>http://dengi-banki-kredit.webnode.ru</link>
<language>ru</language>
<pubDate>Fri, 11 Jan 2013 07:25:00 +0100</pubDate>
<lastBuildDate>Fri, 11 Jan 2013 07:25:00 +0100</lastBuildDate>
<category>
<![CDATA[ Новости ]]>
</category>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<generator>Webnode</generator>
<item>
<title>
<![CDATA[
Росбанк провел новогоднюю благотворительную акцию в поддержку детей
]]>
</title>
<link>
http://dengi-banki-kredit.webnode.ru/news/rosbank-provjel-novogodnjuju-blagotvoritjelnuju-aktsiju-v-poddjerzhku-djetjej/
</link>
<description>
<![CDATA[
Сотрудники Росбанка в рамках базара могли приобрести оригинальные новогодние сувениры, сделанные детьми-сиротами и молодыми людьми с ограниченными возможностями, говорится в сообщении кредитной организации. &nbsp; В базаре приняли участие общественная организация «Художественный центр «Дети Марии», благотворительный проект «Социальные метры», межрегиональная общественная организация помощи детям с особенностями развития и их семьям «Дорога в мир», Центр равных возможностей «Вверх» и свои...
]]>
</description>
<pubDate>Fri, 11 Jan 2013 07:25:00 +0100</pubDate>
<guid isPermaLink="true">
http://dengi-banki-kredit.webnode.ru/news/rosbank-provjel-novogodnjuju-blagotvoritjelnuju-aktsiju-v-poddjerzhku-djetjej/
</guid>
<category>Новости</category>
</item>

但我不明白怎么才能得到ccy,ccy的名字。。。和其他属性

早些时候,我正在解析此xml:

<exchangerate>
<exchangerate ccy="AMD" ccy_name_ru="Армянский драм " ccy_name_ua="Вiрменський драм " ccy_name_en="Armenian Dram " base_ccy="RU" buy="805393" unit="1000.00000" date="2014.01.09"/>
<exchangerate ccy="AUD" ccy_name_ru="Австралийский доллар " ccy_name_ua="Австралiйський долар " ccy_name_en="Australian Dollar " base_ccy="RU" buy="291544" unit="1.00000" date="2014.01.09"/>
</exchangerate>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
<channel>
<atom:link href="http://dengi-banki-kredit.webnode.ru/rss/novosti.xml" rel="self" type="application/rss+xml"/>
<title>
<![CDATA[ Новости - dengi-banki-kredit.webnode.ru ]]>
</title>
<link>http://dengi-banki-kredit.webnode.ru</link>
<language>ru</language>
<pubDate>Fri, 11 Jan 2013 07:25:00 +0100</pubDate>
<lastBuildDate>Fri, 11 Jan 2013 07:25:00 +0100</lastBuildDate>
<category>
<![CDATA[ Новости ]]>
</category>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<generator>Webnode</generator>
<item>
<title>
<![CDATA[
Росбанк провел новогоднюю благотворительную акцию в поддержку детей
]]>
</title>
<link>
http://dengi-banki-kredit.webnode.ru/news/rosbank-provjel-novogodnjuju-blagotvoritjelnuju-aktsiju-v-poddjerzhku-djetjej/
</link>
<description>
<![CDATA[
Сотрудники Росбанка в рамках базара могли приобрести оригинальные новогодние сувениры, сделанные детьми-сиротами и молодыми людьми с ограниченными возможностями, говорится в сообщении кредитной организации. &nbsp; В базаре приняли участие общественная организация «Художественный центр «Дети Марии», благотворительный проект «Социальные метры», межрегиональная общественная организация помощи детям с особенностями развития и их семьям «Дорога в мир», Центр равных возможностей «Вверх» и свои...
]]>
</description>
<pubDate>Fri, 11 Jan 2013 07:25:00 +0100</pubDate>
<guid isPermaLink="true">
http://dengi-banki-kredit.webnode.ru/news/rosbank-provjel-novogodnjuju-blagotvoritjelnuju-aktsiju-v-poddjerzhku-djetjej/
</guid>
<category>Новости</category>
</item>

http://dengi-banki-kredit.webnode.ru
茹
2013年1月11日星期五07:25:00+0100
2013年1月11日星期五07:25:00+0100
http://blogs.law.harvard.edu/tech/rss
网络节点
http://dengi-banki-kredit.webnode.ru/news/rosbank-provjel-novogodnjuju-blagotvoritjelnuju-aktsiju-v-poddjerzhku-djetjej/
2013年1月11日星期五07:25:00+0100
http://dengi-banki-kredit.webnode.ru/news/rosbank-provjel-novogodnjuju-blagotvoritjelnuju-aktsiju-v-poddjerzhku-djetjej/
Новости
我使用以下代码执行此操作:

public class Parser {

    public static String url = null;

    class MyTask extends AsyncTask<String, Void, List<PostItem>> {

        @Override
        protected List<PostItem> doInBackground(String... params) {
            URL feedUrl;
            InputStream is = null;

            try {
                feedUrl = new URL(url);
                is = feedUrl.openConnection().getInputStream();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            final PostItem currentPost = new PostItem();
            final List<PostItem> messages = new ArrayList<PostItem>();
            RootElement root = new RootElement("rss");
            Element channel = root.getChild("channel");
            Element item = channel.getChild("item");
            item.setEndElementListener(new EndElementListener() {
                public void end() {
                    messages.add(currentPost.copy());
                }
            });
            item.getChild("title").setEndTextElementListener(
                    new EndTextElementListener() {
                        public void end(String body) {
                            currentPost.setTitle(body);
                        }
                    });
            item.getChild("link").setEndTextElementListener(
                    new EndTextElementListener() {
                        public void end(String body) {
                            currentPost.setLink(body);
                        }
                    });
            item.getChild("description").setEndTextElementListener(
                    new EndTextElementListener() {
                        public void end(String body) {
                            currentPost.setDescription(body);
                        }
                    });
            item.getChild("pubDate").setEndTextElementListener(
                    new EndTextElementListener() {
                        public void end(String body) {
                            currentPost.setDate(body);
                        }
                    });
            try {
                Xml.parse(is, Xml.Encoding.UTF_8, root.getContentHandler());
            } catch (Exception e) {
                Log.d("MyTag", e.toString());
            }
            return messages;
        }
    }

    public List<PostItem> parse() {
        List<PostItem> result = null;
        MyTask mt = new MyTask();
        try {
            result = mt.execute("").get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        return result;
    }
公共类解析器{
公共静态字符串url=null;
类MyTask扩展了AsyncTask{
@凌驾
受保护列表doInBackground(字符串…参数){
URL-feedUrl;
InputStream=null;
试一试{
feedUrl=新URL(URL);
is=feedUrl.openConnection().getInputStream();
}捕获(格式错误){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
最终positem currentPost=新positem();
最终列表消息=新建ArrayList();
RootElement root=新的RootElement(“rss”);
元素通道=root.getChild(“通道”);
元素项=channel.getChild(“项”);
item.setEndElementListener(新的EndElementListener(){
公共无效结束(){
messages.add(currentPost.copy());
}
});
item.getChild(“title”).setEndTextElementListener(
新的EndTextElementListener(){
公共无效结束(字符串体){
currentPost.setTitle(正文);
}
});
item.getChild(“链接”).setEndTextElementListener(
新的EndTextElementListener(){
公共无效结束(字符串体){
currentPost.setLink(正文);
}
});
item.getChild(“description”).setEndTextElementListener(
新的EndTextElementListener(){
公共无效结束(字符串体){
currentPost.setDescription(正文);
}
});
item.getChild(“pubDate”).setEndTextElementListener(
新的EndTextElementListener(){
公共无效结束(字符串体){
currentPost.setDate(正文);
}
});
试一试{
parse(is,Xml.Encoding.UTF_8,root.getContentHandler());
}捕获(例外e){
Log.d(“MyTag”,例如toString());
}
返回消息;
}
}
公共列表解析(){
列表结果=空;
MyTask mt=新的MyTask();
试一试{
结果=mt.execute(“”.get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
返回结果;
}
但是我不知道如何使用我的新xml,但是用这种方式?
有人能给我解释一下这个东西吗?

这个东西叫属性

现在在SAX解析器中,您有了下面的方法

//opening element tag
public void startElement (String uri, String name, String qName, Attributes atts)
{
    //handle the start of an element
}
因为您正在接收
attributes atts
参数中的所有属性

您可以编写以下代码来获取ccv 字符串strccv=atts.getValue(“ccv”)

理想情况下,你的回答应该是

<exchangerates>
<exchangerate ccy="AMD" ccy_name_ru="Армянский драм " ccy_name_ua="Вiрменський драм " ccy_name_en="Armenian Dram " base_ccy="RU" buy="805393" unit="1000.00000" date="2014.01.09"/>
<exchangerate ccy="AUD" ccy_name_ru="Австралийский доллар " ccy_name_ua="Австралiйський долар " ccy_name_en="Australian Dollar " base_ccy="RU" buy="291544" unit="1.00000" date="2014.01.09"/>
</exchangerates>


在这里,我们将父标记与exchangerates和子标记与exchangerate区分开来。首先,您彼此内部有相同的标记。这是一个错误,您必须更改外部标记名称,如
。您可以读取标记的属性,如下所示:

public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
    if (qName.equals("exchangerate")) {
                 map.put("ccy", attributes.getValue(0)); 
                 map.put("ccy_name_ru", attributes.getValue(1)); 
                 map.put("ccy_name_ua", attributes.getValue(2)); 
                 map.put("ccy_name_en", attributes.getValue(3)); 
                 map.put("base_ccy", attributes.getValue(4)); 
                 map.put("buy", attributes.getValue(5)); 
                 map.put("unit", attributes.getValue(6)); 
                 map.put("date", attributes.getValue(7)); 
    }
}

到目前为止,您尝试了什么?这是一个指向xml文件的链接您想从我这边得到一个解析器代码吗?O给我类似标记的链接吗?