我创建了用于从XML格式获取数据的类,但它多次返回数据,哪里出错了?实际上我只想要两个标签,en
而ur
不是其他标签。我在服务器上的数据
<?xml version="1.0" encoding="UTF-8"?>
<words>
<word wid="373012">
<en>DOCTOR (Noun)</en>
<ur>حکیم </ur>
</word>
<word wid="356630">
<en>DOCTOR (Verb)</en>
<ur>بدلنا </ur>
</word>
<word wid="356633">
<en>DOCTOR (Verb)</en>
<ur>بدلنا دھوکا دینا ۔</ur>
</word>
<word wid="329801">
<en>DOCTOR</en>
<ur>ڈاکٹر معالج ۔</ur>
</word>
<word wid="364114">
<en>DOCTOR</en>
<ur>اُستاد </ur>
</word>
<word wid="190805">
<en>DOCTOR (Verb)</en>
<ur>ڈاکٹر بنانا ۔</ur>
</word>
</words>
用于还原列表和XML解析的Java代码
try {
ArrayList<UEDWord> list = null;
URL URL = new URL(stringURL);
XMLReader mXMLReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
mXMLReader.setContentHandler(new MXMLHandler());
mXMLReader.parse(new InputSource(URL.openStream()));
list = MXMLHandler.getSearchResults();
return list;
} catch (Exception e) {
return null;
}
//
public class MXMLHandler extends DefaultHandler {
public static ArrayList<UEDWord> SearchResults = new ArrayList<UEDWord>();
String LastEngWord = "";
String LastUrduWord = "";
Boolean currentElement = false;
String currentValue = null;
public MXMLHandler() {
SearchResults.clear();
}
public static ArrayList<UEDWord> getSearchResults() {
return SearchResults;
}
public void characters(char[] characters, int position, int noOfChar) throws SAXException {
if (currentElement) {
currentValue = new String(characters, position, noOfChar);
currentElement = false;
}
}
public void startElement(String URI, String localname, String qualifiedname, Attributes attributes)
throws SAXException {
currentElement = true;
}
public void endElement(String URI, String localname, String qualifiedname) throws SAXException {
currentElement = false;
if (localname.equalsIgnoreCase("en"))
LastEngWord = currentValue;
// do {
if (localname.equalsIgnoreCase("ur"))
LastUrduWord = currentValue;
// return;
// } while (!localname.equalsIgnoreCase("word"));
// Log.e(URI, localname + " " + qualifiedname);
SearchResults.add(new UEDWord(LastEngWord, LastUrduWord));
}
}
SetterGetter类别
public class UEDWord {
private String EngWord;
private String UrduWord;
UEDWord(String EngWord, String UrduWord) {
this.EngWord = EngWord;
this.UrduWord = UrduWord;
}
public String getEngWord() {
return this.EngWord;
}
public String getUrduWord() {
return this.UrduWord;
}
public void setEngWord(String EngWord) {
this.EngWord = EngWord;
}
public void setUrduWord(String UrduWord) {
this.UrduWord = UrduWord;
}
}
我认为这是正在发生的事情:
您的解析器到达'en'元素。进入“ startElement”方法,将“ currentElement”设置为true,然后进入“ characters”方法,在该方法中加载字符串,最后进入“ endElement”方法,在该方法中,该字符串用于创建UEDWord。
此时,已经存在一个错误:您正在尝试使用EN和UR作为它的参数来创建UEDWord,但是这里只有两个。在创建和添加Word之前,请检查两者是否均已设置。
向前,您的解析器将查看'ur'元素。读取内容。创建一个新Word并将其添加到列表中(此时,您创建并添加了2个Word而不是1个Word)。
现在解析器继续查看'/ word',从之前关闭'word'元素。因此调用了endElement方法,但从未重置currentValue,因此创建了一个与以前相同的新UEDWord并将其添加到数组中。
最后,如果我正确地解决了您的问题,那么您应该有13个多余的单词。
我的建议是检查在endElement中找到的哪个元素,并且仅在准备添加EN和UR单词的情况下才添加到列表中。将值添加到列表后,清除currentValue和LastEngWord,LastUrduWord,以便下次可以检查它们是否为空。
这应该起作用(如评论中所述,未经测试):
public class MXMLHandler extends DefaultHandler {
public static ArrayList<UEDWord> SearchResults = new ArrayList<UEDWord>();
String LastEngWord = null;
String LastUrduWord = null;
boolean currentElement = false;
String currentValue = null;
public MXMLHandler() {
SearchResults.clear();
}
public static ArrayList<UEDWord> getSearchResults() {
return SearchResults;
}
public void characters(char[] characters, int position, int noOfChar) throws SAXException {
if (currentElement) {
currentValue = new String(characters, position, noOfChar);
currentElement = false;
}
}
public void startElement(String URI, String localname, String qualifiedname, Attributes attributes)
throws SAXException {
currentElement = true;
}
public void endElement(String URI, String localname, String qualifiedname) throws SAXException {
currentElement = false;
if (localname.equalsIgnoreCase("en"))
LastEngWord = currentValue;
else if (localname.equalsIgnoreCase("ur"))
LastUrduWord = currentValue;
if(LastEngWord != null && LastUrdWord != null)
{
SearchResults.add(new UEDWord(LastEngWord, LastUrduWord));
LastEngWord = null;
LastUrdWord = null;
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句