java - 如何解决我的应用程序中的解析器错误?

标签 java android saxparser

我成功地解析了我的 xml 文件,但现在我得到的是空值。所以我不知道我在编码中犯了什么错误。我想在我的屏幕上显示我的字符串值。现在我试图以 TextView 格式显示该字符串值,但我得到的是空值......

我的 xml 文件:

<Mobiles>
<Mobile>
<Phone>Nokia 1108</Phone>
<Network>GSM 900/1800 MHz</Network>
<Size>106x46x20 mm</Size>
<Ringtones>mono</Ringtones>
<SMS>yes</SMS>
<MMS>no</MMS>
<Email>no</Email>
<InstantMessaging >no</InstantMessaging>
</Mobile>

<Mobile>
<Phone>Nokia 1109</Phone>
<Network>GSM 900/1800 MHz</Network>
<Size>106x46x20 mm</Size>
<Ringtones>mono</Ringtones>
<SMS>yes</SMS>
<MMS>no</MMS>
<Email>no</Email>
<InstantMessaging >no</InstantMessaging>
</Mobile>

<Mobile>
<Phone>Nokia 1110</Phone>
<Network>GSM 900/1800 MHz</Network>
<Size>106x46x20 mm</Size>
<Ringtones>mono</Ringtones>
<SMS>yes</SMS>
<MMS>no</MMS>
<Email>no</Email>
<InstantMessaging >no</InstantMessaging>
</Mobile>

<Mobile>
<Phone>Nokia 1111</Phone>
<Network>GSM 900/1800 MHz</Network>
<Size>106x46x20 mm</Size>
<Ringtones>mono</Ringtones>
<SMS>yes</SMS>
<MMS>no</MMS>
<Email>no</Email>
<InstantMessaging >no</InstantMessaging>
</Mobile>
</Mobiles>

输出: enter image description here

最佳答案

只要简要浏览一下您的代码,我就会说问题出在您的 in_Mobiles 变量上的状态转换。从文档的开头到结尾,它始终为 true

在您的 characters(char[], int, int) 方法中,第一个条件分支将因此消耗所有字符:

if (this.in_Mobiles) {
    myParsedExampleDataSet.setMobiles(new String(ch, start, length));

同样的行为在 in_Mobile 的使用中重复出现,如果你修复了第一个,将成为下一个罪魁祸首。

编辑: 好吧,总的来说,您的解析器实现有点不稳定。尝试这样的事情:

首先,您的 ParsedExampleDataSet 有点不对。

改为将其转换为 Mobile 对象列表,如下所示:

public class ParsedExampleDataSet extends ArrayList<Mobile>{
}

接下来,创建一个名为 Mobile 的 bean 类,如下所示:

class Mobile {
    private String Phone;
    private String Network;
    private String Size;
    private String Ringtones;
    private boolean SMS;
    private boolean MMS;
    private boolean Email;
    private boolean InstantMessaging;
    public String getPhone() {
        return Phone;
    }
    public void setPhone(String phone) {
        Phone = phone;
    }
    public String getNetwork() {
        return Network;
    }
    public void setNetwork(String network) {
        Network = network;
    }
    public String getSize() {
        return Size;
    }
    public void setSize(String size) {
        Size = size;
    }
    public String getRingtones() {
        return Ringtones;
    }
    public void setRingtones(String ringtones) {
        Ringtones = ringtones;
    }
    public boolean isSMS() {
        return SMS;
    }
    public void setSMS(boolean sMS) {
        SMS = sMS;
    }
    public boolean isMMS() {
        return MMS;
    }
    public void setMMS(boolean mMS) {
        MMS = mMS;
    }
    public boolean isEmail() {
        return Email;
    }
    public void setEmail(boolean email) {
        Email = email;
    }
    public boolean isInstantMessaging() {
        return InstantMessaging;
    }
    public void setInstantMessaging(boolean instantMessaging) {
        InstantMessaging = instantMessaging;
    }
}

最后,您的 DefaultHandler 子类需要重新设计。像这样的东西应该可以工作。

class ExampleHandler extends DefaultHandler {
    private ParsedExampleDataSet Mobiles;
    private Mobile CurrentMobile;
    private StringBuilder Characters;
    public ParsedExampleDataSet getParsedExampleDataSet() {
        return Mobiles;
    }
    public void startDocument() throws SAXException {
        Mobiles = new ParsedExampleDataSet();
    }
    public void startElement(String namespaceUri, String localName, String qName, Attributes atts)
            throws SAXException {
        String name = localName.equals("") ? qName : localName;
        if ("Mobile".equals(name)) {
            CurrentMobile = new Mobile();
        }
        // Empty accumulated characters
        Characters = null;
    }
    public void characters(char[] ch, int offset, int length) throws SAXException {
        if (Characters == null) {
            Characters = new StringBuilder(length);
        }
        Characters.append(ch, offset, length);
    }
    public void endElement(String namespaceUri, String localName, String qName) throws SAXException {
        String name = localName.equals("") ? qName : localName;
        if ("Mobile".equals(name)) {
            Mobiles.add(CurrentMobile);
            CurrentMobile = null;
        } else if (CurrentMobile != null && Characters != null){
            String value = Characters.toString();
            if ("Phone".equals(name)) {
                CurrentMobile.setPhone(value);
            } else if ("Network".equals(name)) {
                CurrentMobile.setNetwork(value);
            } else if ("Size".equals(name)) {
                CurrentMobile.setSize(value);
            } else if ("Ringtones".equals(name)) {
                CurrentMobile.setRingtones(value);
            } else {
                boolean yes = "yes".equalsIgnoreCase(value.trim());
                if ("SMS".equals(name)) {
                    CurrentMobile.setSMS(yes);
                } else if ("MMS".equals(name)) {
                    CurrentMobile.setMMS(yes);
                } else if ("Email".equals(name)) {
                    CurrentMobile.setEmail(yes);
                } else if ("InstantMessaging".equals(name)) {
                    CurrentMobile.setInstantMessaging(yes);
                }
            }
        }
    }
}

并且,像这样运行它应该会产生一个结果:

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
ExampleHandler handler = new ExampleHandler();
InputSource is = new InputSource(/* your XML goes here as an inputstream or reader*/);
parser.parse(is, handler);
ParsedExampleDataSet mobiles = handler.getParsedExampleDataSet();
for (Mobile mobile : mobiles) {
    System.out.println(mobile.getPhone());
}

关于java - 如何解决我的应用程序中的解析器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8742739/

相关文章:

java - 从 JSP 调用 Servlet 的方法

java - 使用嵌套面板

java - 找不到我的 NullPointerException

java - 当应用程序进入后台时,我应该在哪里启动一个应该触发的 Activity ?

java - java代码中的HTML解析异常org.xml.sax.SAXParseException

java - 如何在java中将Protobuf ByteString转换为八进制转义字符串?

android - 打开日历应用程序并在android中获取日期的点击事件

java - 要解析的 'Push Approach' 和 'Pull Approach' 是什么?

android - Gradle 构建错误 : SAXParseException

java - 扫描仪应该在这个程序中放在哪里?