Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.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
Android SAX解析器不会读取和打印xml文件的一部分_Android_Xml_Xml Parsing_Saxparser_Linkparser - Fatal编程技术网

Android SAX解析器不会读取和打印xml文件的一部分

Android SAX解析器不会读取和打印xml文件的一部分,android,xml,xml-parsing,saxparser,linkparser,Android,Xml,Xml Parsing,Saxparser,Linkparser,我真的需要有人帮助我让解析器读取和显示xml文件的一部分,我可以从上到下读取两部分,但当我尝试使用xml处理程序中的内部标记将每个部分分离出来时,它不会这样做,而是会动脑筋,并显示其中的一部分 这是我的解析器的代码 package heavytime import java.net.URL; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Inp

我真的需要有人帮助我让解析器读取和显示xml文件的一部分,我可以从上到下读取两部分,但当我尝试使用xml处理程序中的内部标记将每个部分分离出来时,它不会这样做,而是会动脑筋,并显示其中的一部分

这是我的解析器的代码

package heavytime
import java.net.URL;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

//import android.content.Intent;
import android.os.Bundle;
//import android.view.View;
//import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class Mainweather extends Seskanoreweatherpart2Activity {

weatherlist sitesList = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main2);

     LinearLayout layout = new LinearLayout(this);
     layout.setOrientation(1);
     layout.setBackgroundColor(0xFF000080);

     TextView value [];

    try {

        /** Handling XML */
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();

        /** Send URL to parse XML Tags */
        URL sourceUrl = new URL(
        "http://www.seskanore.com/currentoutput.xml");


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

        } catch (Exception e) {
        System.out.println("XML Pasing Excpetion = " + e);
        }

        /** Get result from XMLhandler SitlesList Object */
        sitesList = XMLhandler.sitesList;

        /** Assign textview array lenght by arraylist size */
   //       item = new TextView[sitesList.getName().size()];
        value = new TextView[sitesList.getName().size()];

        /** Set the result text in textview and add it to layout */
        for (int i = 0; i < sitesList.getName().size(); i++) {
        value[i] = new TextView(this);
        value[i].setText(sitesList.getvalue().get(i)+ " is "           +sitesList.getitem().get(i));

        layout.addView(value[i]);

         }


        /** Set the layout view to display */
        setContentView(layout);
 }
 }
这是我的Arraylist用于显示解析信息的代码

    package heavytime
    import java.util.ArrayList;


    public class weatherlist {

private ArrayList<String> value = new ArrayList<String>();
private ArrayList<String> name = new ArrayList<String>();
private ArrayList<String> item = new ArrayList<String>();

/** In Setter method default it will return arraylist
* change that to add */

public ArrayList<String> getvalue() {
return value;
}

public void setValue(String value) {
this.value.add(value);
}

public ArrayList<String> getName() {
return name;
}

public void setName(String name) {
this.name.add(name);
}

public ArrayList<String> getitem() {
return item;
}

public void setitem(String item) {
this.item.add(item);
}

  }
包重定时
导入java.util.ArrayList;
公共类天气表{
私有ArrayList值=新ArrayList();
private ArrayList name=new ArrayList();
私有ArrayList项=新建ArrayList();
/**在Setter方法默认值中,它将返回arraylist
*将其更改为添加*/
公共ArrayList getvalue(){
返回值;
}
公共void设置值(字符串值){
这个.价值.增加(价值);
}
公共ArrayList getName(){
返回名称;
}
公共void集合名(字符串名){
此.名称.添加(名称);
}
公共阵列列表getitem(){
退货项目;
}
公共void集合项(字符串项){
本.项.增加(项);
}
}
我希望它只显示温度标签内的标签,但我尝试了所有方法,但似乎没有任何效果 谁能帮帮我吗


非常感谢

您犯了一个常见的错误,即假定在来自解析器的一对
startElement
endElement
调用之间只调用一次
characters
方法,并在start和end标记之间提供entore内容。它实际上可以被调用多次,每次调用只包含部分内容

正确的处理方法是在startElement方法中创建或附加某种累加器(通常是
StringBuilder
StringBuffer
),在characters方法中累加到累加器中,然后在endElement方法中使用和处置或分离累加器

我认为您的代码中还有很多错误,但这可能是使其正常工作的一个开始

为了仅处理特定标记中的项目,您需要设置一个布尔标志,表示您在看到该标记时在
startElement
方法中找到了该标记,在标记的endElement中将其设置为false,并在从任何其他标记收集数据之前测试该标志。您需要对每个带有
的子标签使用上面描述的过程,因为它们包含字符形式的数据

出于我自己的娱乐,并希望它能帮助您更好地理解这一切,我已经编写了一个小处理程序,将
下的数据收集到地图列表中

package com.donroby;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WeatherHandler extends DefaultHandler {

    private List<Map<String,String>> result = new ArrayList<Map<String,String>>();
    private Map<String,String> currentItem;
    private boolean collectingItems;
    private boolean collectingItem;
    private StringBuilder builder;

    public List<Map<String,String>> getResult() {
        return result;
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (qName.equals("temperaturetags")) {
            collectingItems = true;
        }
        else if (qName.equals("item") && collectingItems) {
            currentItem = new HashMap<String,String>();
            currentItem.put("name", attributes.getValue("name"));
            collectingItem = true;
        }
        else if (collectingItem) {
            builder = new StringBuilder();
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (qName.equals("temperaturetags")) {
            collectingItems = false;
        }
        if (qName.equals("item") && collectingItems) {
            result.add(currentItem);
            currentItem = null;
            collectingItem = false;
        }
        else if (collectingItem) {
            currentItem.put(qName,  builder.toString());
            builder = null;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (collectingItem &&(builder != null)) {
           builder.append(ch, start, length);
        }
    }
}
package com.donroby;
导入org.xml.sax.Attributes;
导入org.xml.sax.SAXException;
导入org.xml.sax.helpers.DefaultHandler;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
公共类WeatherHandler扩展了DefaultHandler{
私有列表结果=新的ArrayList();
私有地图项目;
私人收藏物品;
私有布尔集合项;
私人建筑商;
公共列表getResult(){
返回结果;
}
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、属性)引发SAXException{
if(qName.equals(“temperaturetags”)){
CollectionItems=true;
}
else if(qName.equals(“项目”)&收集项目){
currentItem=新的HashMap();
currentItem.put(“名称”),attributes.getValue(“名称”);
CollectionItem=true;
}
else if(收集项目){
生成器=新的StringBuilder();
}
}
@凌驾
public void endElement(字符串uri、字符串localName、字符串qName)引发SAXException{
if(qName.equals(“temperaturetags”)){
CollectionItems=false;
}
if(qName.equals(“项目”)&收集项目){
结果.添加(当前项);
currentItem=null;
CollectionItem=false;
}
else if(收集项目){
currentItem.put(qName,builder.toString());
builder=null;
}
}
@凌驾
公共无效字符(char[]ch,int start,int length)引发异常{
if(collectingItem&(builder!=null)){
builder.append(ch,start,length);
}
}
}
对于实际使用,我更可能创建一个域对象并将其收集到该类的列表中,但这会使代码膨胀,超出我想要的快速示例的范围

characters()
函数中,使用
String.trim()
然后检查
String.length()>0
,然后继续


然后分别在
startElement()
endElement()事件中使用
stack
模型和
push()
pop()
数据

可以粘贴XML吗?XML很长,我可以让解析器根据我在xml处理程序中使用的标记从上到下读取和打印整个xml表,这就是为什么我认为问题在于我搜索标记的方式,因为内部标记是相同的,唯一不同的标记是中间的标记,因此,如果我在startelement和endelement中放置一个stringbuffer,它将只允许读取和显示我想要的标记的一部分?啊,是的,我现在知道我哪里出错了:)谢谢你的帮助,非常感谢:)
package com.donroby;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WeatherHandler extends DefaultHandler {

    private List<Map<String,String>> result = new ArrayList<Map<String,String>>();
    private Map<String,String> currentItem;
    private boolean collectingItems;
    private boolean collectingItem;
    private StringBuilder builder;

    public List<Map<String,String>> getResult() {
        return result;
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (qName.equals("temperaturetags")) {
            collectingItems = true;
        }
        else if (qName.equals("item") && collectingItems) {
            currentItem = new HashMap<String,String>();
            currentItem.put("name", attributes.getValue("name"));
            collectingItem = true;
        }
        else if (collectingItem) {
            builder = new StringBuilder();
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (qName.equals("temperaturetags")) {
            collectingItems = false;
        }
        if (qName.equals("item") && collectingItems) {
            result.add(currentItem);
            currentItem = null;
            collectingItem = false;
        }
        else if (collectingItem) {
            currentItem.put(qName,  builder.toString());
            builder = null;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (collectingItem &&(builder != null)) {
           builder.append(ch, start, length);
        }
    }
}