【问题标题】:SAXParser doesn't retrieves XML data from URLSAXParser 不从 URL 检索 XML 数据
【发布时间】:2016-07-31 16:43:10
【问题描述】:

我实现的 SAXParser 类使用 URL 地址 处理 XML 数据不返回结果。该类使用额外的 Currency 类,该类又使用 setter/getter 存储两个变量 currIdrate。当我运行我的课程时,Java 控制台中没有显示任何内容。代码如下:

public class MySAXParser extends DefaultHandler {

    private static List<Currencies> currencies = new ArrayList<Currencies>();
    private static Currencies curr = null;
    private static String text = null;

    public static void main(String[] args) {

        String url = "http://nbt.tj/en/kurs/export_xml.php?date=2016-08-01&export=xmlout";

        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            MySAXParser handler = new MySAXParser();
            URL uri = new URL(url);
            sp.parse(new InputSource(uri.openStream()), handler);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        for (Currencies curr : currencies) {
            System.out.println(curr.toString());
        }

    }

    public void startElement (String s, String s1, String elementName, Attributes atts) throws SAXException {
        if (elementName.equalsIgnoreCase("valute")) {
            curr = new Currencies();
            curr.setCurrId(atts.getValue("id"));
        }
    }

    public void endElement (String s, String s1, String element) throws SAXException {
        if (element.equals("valute")) {
            currencies.add(curr);
        }
        if (element.equalsIgnoreCase("value")) {
            curr.setRate(Double.parseDouble(text));
        }
    }

    @Override
    public void characters (char[] ch, int start, int length) throws SAXException {
        text = String.copyValueOf(ch, start, length).trim();
    }

}

那么,我错过了什么或做错了什么?任何帮助将不胜感激。

【问题讨论】:

  • 比较s1.equalsIgnoreCase而不是第三个参数有帮助吗?
  • @MartinHonnen,使用第二个参数s1 也没有结果。
  • 据我记得,SAX 不保证将文本节点报告为单个字符事件,因此您还需要改进该代码。但是正如您所说,您根本没有得到任何结果,我不确定仅通过阅读代码有什么问题。如果没有人发现问题,请使用调试器检查问题所在。

标签: java xml url xml-parsing saxparser


【解决方案1】:

这是我在 Java 1.8 上的尝试:

import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;


public class MySAXParser extends DefaultHandler {

    private List<Currency> currencies = new ArrayList<>();
    private Currency curr = null;
    private StringBuilder sb;

    public static void main(String[] args) {

        String url = "http://nbt.tj/en/kurs/export_xml.php?date=2016-08-01&export=xmlout";

        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            spf.setNamespaceAware(true);

            SAXParser sp = spf.newSAXParser();
            MySAXParser handler = new MySAXParser();

            sp.parse(new InputSource(url), handler);

            for (Currency curr : handler.getCurrencies()) {
                System.out.println(curr.toString());
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    public List<Currency> getCurrencies() {
        return currencies;
    }

    @Override
    public void startElement(String s, String localName, String elementName, Attributes atts) throws SAXException {
        if (elementName.equalsIgnoreCase("valute")) {
            curr = new Currency();
            currencies.add(curr);
            curr.setCurrId(atts.getValue("ID"));
        } else if (elementName.equalsIgnoreCase("value") || elementName.equalsIgnoreCase("CharCode")) {
            sb = new StringBuilder();
        }
    }

    @Override
    public void endElement(String s, String localName, String elementName) throws SAXException {
        if (elementName.equalsIgnoreCase("value")) {
            curr.setRate(Double.parseDouble(sb.toString()));
            sb = null;
        }
        else if (elementName.equalsIgnoreCase("CharCode")) {
            curr.setCharCode(sb.toString());
            sb = null;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (sb != null) {
            sb.append(ch, start, length);
        }
    }

}

班级是

public class Currency {

    private String currId;

    /**
     * Get the value of currId
     *
     * @return the value of currId
     */
    public String getCurrId() {
        return currId;
    }

    /**
     * Set the value of currId
     *
     * @param currId new value of currId
     */
    public void setCurrId(String currId) {
        this.currId = currId;
    }

        private double rate;

    /**
     * Get the value of rate
     *
     * @return the value of rate
     */
    public double getRate() {
        return rate;
    }

    /**
     * Set the value of rate
     *
     * @param rate new value of rate
     */
    public void setRate(double rate) {
        this.rate = rate;
    }

    private String charCode;

    /**
     * Get the value of charCode
     *
     * @return the value of charCode
     */
    public String getCharCode() {
        return charCode;
    }

    /**
     * Set the value of charCode
     *
     * @param charCode new value of charCode
     */
    public void setCharCode(String charCode) {
        this.charCode = charCode;
    }

    @Override
    public String toString() {
        return "Currency{" + "currId=" + currId + ", rate=" + rate + ", charCode=" + charCode + '}';
    }

}

我得到的示例输出是

Currency{currId=840, rate=7.8683, charCode=USD}
Currency{currId=978, rate=8.7448, charCode=EUR}
Currency{currId=960, rate=10.9395, charCode=XDR}
Currency{currId=156, rate=1.1828, charCode=CNY}
Currency{currId=756, rate=8.075, charCode=CHF}
Currency{currId=810, rate=0.1146, charCode=RUB}
Currency{currId=860, rate=0.2655, charCode=UZS}
Currency{currId=417, rate=1.1643, charCode=KGS}
Currency{currId=398, rate=0.2234, charCode=KZT}
Currency{currId=933, rate=3.9424, charCode=BYR}
Currency{currId=364, rate=0.2617, charCode=IRR}
Currency{currId=971, rate=1.139, charCode=AFN}
Currency{currId=586, rate=0.7504, charCode=PKR}
Currency{currId=949, rate=2.6076, charCode=TRY}
Currency{currId=934, rate=2.2481, charCode=TMT}
Currency{currId=826, rate=10.3618, charCode=GBP}
Currency{currId=36, rate=5.9162, charCode=AUD}
Currency{currId=208, rate=1.1755, charCode=DKK}
Currency{currId=352, rate=0.659, charCode=ISK}
Currency{currId=124, rate=5.9699, charCode=CAD}
Currency{currId=414, rate=26.004, charCode=KWD}
Currency{currId=578, rate=0.9193, charCode=NOK}
Currency{currId=702, rate=5.8215, charCode=SGD}
Currency{currId=752, rate=0.9136, charCode=SEK}
Currency{currId=392, rate=0.761, charCode=JPY}
Currency{currId=944, rate=4.9639, charCode=AZN}
Currency{currId=51, rate=1.6516, charCode=AMD}
Currency{currId=981, rate=3.3539, charCode=GEL}
Currency{currId=498, rate=0.3979, charCode=MDL}
Currency{currId=980, rate=0.317, charCode=UAH}
Currency{currId=784, rate=2.1421, charCode=AED}
Currency{currId=682, rate=2.0979, charCode=SAR}
Currency{currId=356, rate=1.175, charCode=INR}
Currency{currId=985, rate=2.0039, charCode=PLN}
Currency{currId=458, rate=1.9313, charCode=MYR}
Currency{currId=764, rate=0.2258, charCode=THB}

【讨论】:

  • 感谢您的提示。很好地使用 s1 参数并将 SAXParserFactory 设置为命名空间感知也没有结果。
  • @Dozent,我现在有时间启动 Java IDE 并测试该代码,我之前关于第二个参数的提示似乎没有帮助,因为如果未启用命名空间,它也是空的,所以上面我已经使用了原始代码sn-p中的第三个参数。
  • 感谢您的回答,现在可以使用了。但是我不明白为什么它适用于Valute, Value, ID 而不是valute, value, id。你知道为什么吗?
  • 在 XML 中,与在 Java 中一样,名称的大小写很重要,因此您当然需要准确使用 XML 中给出的属性名称。所以我不得不更正属性访问以提取 ID。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多