Android SAX解析器不会读取和打印xml文件的一部分
我真的需要有人帮助我让解析器读取和显示xml文件的一部分,我可以从上到下读取两部分,但当我尝试使用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
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);
}
}
}