问题描述
当我使用 SAXParser 时,我有 XML 流,我总是面对具有不同值的重复元素,所以 解析器无法区分它们,所以我使用 xmlReader 来设置另一个处理程序 问题第一个处理程序正常工作,但第二个处理程序总是抛出 null 我找不到问题出在哪里,如果有什么可以优化我的代码
<players>
<player nation ="Egypt" Gender ="male">
<id>20</id>
<name>ahmed</name>
<teams total="2">
<team val = "200">
<id>30</id>
<name>geh</name>
<start-date>
<year>2009</year>
<month>9</month>
</start-date>
<is-current>true</is-current>
</team>
<team>
<id>23</id>
<name>slk</name>
<start-date>
<year>2007</year>
<month>11</month>
</start-date>
<end-date>
<year>2009</year>
<month>7</month>
</end-date>
</team>
</teams>
</player >
public List<Player> players(){
return playerlist;
}
public List<Team> AddTeam( List teams){
this.teams = teams;
return teams;
}
@Override
public void startElement(String uri,String localName,String qName,Attributes Attr) throws SAXException {
if(qName.equalsIgnoreCase("player")){
player = new Player();
for(int i = 0 ; i < Attr.getLength(); i++){
String attr = Attr.getValue(i);
player.setAttr(attr);
}
if(playerlist == null){
playerlist = new LinkedList<>();
}
}
else if(qName.equalsIgnoreCase("id")){
hasid = true;
}
else if(qName.equalsIgnoreCase("name")){
hasname = true;
}
else if(qName.equalsIgnoreCase("teams")){
hasteams = true;
}
else if(qName.equalsIgnoreCase("team")){
reader.setContentHandler(new TeamHandler(reader,this));
}
}
@Override
public void characters(char[] ch,int start,int length){
if(hasid){
player.setId(Integer.parseInt(new String(ch,start,length)));
hasid = false;
}
if(hasname){
player.setName(new String(ch,length));
hasname =false;
}
else if(hasteams){
player.setTeams(new String(ch,length));
hasteams = false;
}
else if(hasteam){
player.setTeam(new String(ch,length));
hasteam = false;
}
}
@Override
public void endElement(String uri,String qName)throws SAXException{
if(qName.equalsIgnoreCase("player")){
playerlist.add(player);
}
}
}
public TeamHandler(XMLReader reader,PlayerHandler parent){
this.reader =reader;
this.parent= parent;
this.team = new Team();
this.teamList = new LinkedList<Team>();
teams();
}
private boolean teamid = false;
private boolean teamname = false;
private boolean teamstart = false;
private boolean teamcurrent = false;
private boolean teamend = false;
private List<Team> teamList ;
private Team team;
public List<Team> teams(){
return teamList;
}
@Override
public void startElement(String uri,String LocalName,Attributes Attr) throws SAXException{
if(qName.equalsIgnoreCase("name")){
teamname =true;
}
if(qName.equalsIgnoreCase("id")){
teamid =true;
}
}
@Override
public void characters(char[] ch,int length){
if(teamid){
team.setTeam_id(Integer.parseInt(new String(ch,length)));
teamid =false;
}
else if(teamname){
team.setTeam_name(new String(ch,length));
teamname =false;
}
}
@Override
public void endElement (String uri,String qName)
throws SAXException{
if(qName.equals("team")){
teamList.add(team);
parent.AddTeam(teamList);
reader.setContentHandler(parent);
}
}
}
结果总是这样:
Player{name='ahmed',id=20,teams='
',team='null',Attr='male'}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)