【问题标题】:How to get data from XML in Android如何在 Android 中从 XML 中获取数据
【发布时间】:2016-11-27 03:25:02
【问题描述】:

我创建了用于从 XML 格式获取数据的类,但它多次返回数据哪里有问题?实际上我只想两个标签 enur 不是其他的。 我在服务器上的数据

<?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;
    }
}

【问题讨论】:

  • 抱歉,您为什么不想将这些数据存储在带有适合您语言后缀的 strings.xml 中?
  • 所以您说您的 Android 应用程序正在从服务器中提取该 XML 文件,然后对其进行解析?还是您的 Android 应用构建的 XML 然后发送到服务器?
  • 亲爱的@MichaelSpitsin 数据在服务器上,数据记录超过100000,无法存储在string.xml中
  • @LuigiPower 我将数据存储在 phpmysql 上,我提供的词是查询数据库,并以上述形式返回数据。
  • 另外,请不要在 Java 变量中使用大写首字母。

标签: android arraylist xml-parsing


【解决方案1】:

这是我认为正在发生的事情:

您的解析器到达“en”元素。进入“startElement”方法,将“currentElement”设置为true,然后进入加载字符串的“characters”方法,最后进入使用String创建UEDWord的“endElement”方法。

此时已经出现错误:您正尝试使用 EN 和 UR 作为参数来创建 UEDWord,但这里您只有两者之一。在创建和添加 Word 之前检查是否都设置了。

接下来,您的解析器会查看“ur”元素。读取内容。创建一个新单词并将其添加到您的列表中(此时,您创建并添加了 2 个单词而不是 1 个)。

现在解析器继续查看“/word”,关闭之前的“word”元素。所以调用了endElement方法,但是currentValue从来没有被重置过,所以新建了一个和之前一样的UEDWord并添加到数组中。

最后,如果我没看错你的问题,你应该有 13 个多余的字。

我的建议是检查您在 endElement 中找到的元素,并且仅当您的 EN 和 UR 单词都准备好添加时才添加到列表中。将值添加到列表后,清除 currentValue 和 LastEngWord、LastUrduWord,以便下次能够检查它们是否为空。

这应该有效(如 cmets 所述,未经测试):

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;
        }
    }
}

【讨论】:

  • 我可以尝试用我认为应该可以解决问题的方式编辑帖子,但我无法对其进行测试。我还是要写吗?
  • 我更新了我的问题,现在更清楚了。如果可以的话,请帮助我。
  • 你能告诉我“list = MXMLHandler.getSearchResults();”之后的“list”里面是什么吗?
  • 现在感谢它的作品,那个时候只有互联网问题:)
  • 很高兴能帮上忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2013-02-24
  • 2011-04-13
  • 1970-01-01
  • 2023-03-28
  • 2015-04-26
相关资源
最近更新 更多