SAX 解析 android : 如何获取子节点
SAX parsing android : how to get child nodes
我想从 XML 文件中获取数据:https://www.vietcombank.com.vn/exchangerates/ExrateXML.aspx
错误是我可以获得最后一个元素 USD 并传递其他元素。请帮助我
这是我的全部class:
Exrate.java
public class Exrate {
String CurrencyCode;
String CurrencyName;
String Buy;
String Transfer;
String Sell;
public Exrate(){}
public String getCurrencyCode() {
return CurrencyCode;
}
public void setCurrencyCode(String CurrencyCode) {
this.CurrencyCode = CurrencyCode;
}
//
public String getCurrencyName(){
return CurrencyName;
}
public void setCurrencyName(String CurrencyName){
this.CurrencyName=CurrencyName;
}
//
public String getBuy(){
return Buy;
}
public void setBuy(String Buy ){
this.Buy=Buy;
}
//
public String getTransfer(){
return Transfer;
}
public void setTransfer(String Transfer ){
this.Transfer=Transfer;
}
//
public String getSell(){
return Sell;
}
public void setSell(String Sell ){
this.Sell=Sell;
}
}
ExrateList.java
public class ExrateList {
String Datetime;
Exrate exrate;
public ExrateList(){}
public String getDatetime(){
return Datetime;
}
public void setDatetime(String DateTime){
this.Datetime=DateTime;
}
//
public Exrate getExrate(){
return exrate;
}
public void setExrate(Exrate exrate){
this.exrate=exrate;
}
}
SaxHandler.java
public class SaxHandler extends DefaultHandler {
String reading;
ArrayList<ExrateList> exrateLists;
ExrateList exrateList;
Exrate exrate;
public SaxHandler() {
exrateLists = new ArrayList<ExrateList>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("ExrateList")){
exrateLists=new ArrayList<>();
exrateList=new ExrateList();
}
if (qName.equalsIgnoreCase("Exrate")){
exrate=new Exrate();
exrate.setCurrencyCode(attributes.getValue("CurrencyCode"));
exrate.setCurrencyName(attributes.getValue("CurrencyName"));
exrate.setBuy(attributes.getValue("Buy"));
exrate.setTransfer(attributes.getValue("Transfer"));
exrate.setSell(attributes.getValue("Sell"));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("ExrateList")){
if (exrateLists!=null){
exrateLists.add(exrateList);
exrateList=null;
}
}
if (qName.equalsIgnoreCase("DateTime")){
exrateList.setDatetime(reading);
}
else if (qName.equalsIgnoreCase("Exrate")){
exrateList.setExrate(exrate);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
reading=new String(ch, start, length);
}
public List<ExrateList> getExrateLists() {
return exrateLists;
}
}
MySaxParser.java
public class MySaxParser {
public List<ExrateList> XMLparse(InputStream is) {
List<ExrateList> exrateLists = null;
try {
// create a XMLReader from SAXParser
XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
// create a SAXXMLHandler
SaxHandler saxHandler = new SaxHandler();
// store handler in XMLReader
xmlReader.setContentHandler(saxHandler);
// the process starts
xmlReader.parse(new InputSource(is));
// get the `Employee list`
exrateLists =saxHandler.getExrateLists();
} catch (Exception ex) {
Log.d("XML", "SAXXMLParser: parse() failed");
}
// return Employee list
return exrateLists;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
TextView ngay, chuoi;
String duongdan = "https://www.vietcombank.com.vn/exchangerates/ExrateXML.aspx";
List<ExrateList> exrateLists = new ArrayList<ExrateList>();
String datetime;
String macode="";
String tencode="";
String mua="";
InputStream is;
URL url;
URLConnection connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ngay = (TextView) findViewById(R.id.textView);
chuoi = (TextView) findViewById(R.id.textView2);
Task a=new Task();
a.execute();
}
class Task extends AsyncTask<Void,Void,Void>
{
@Override
protected Void doInBackground(Void... params) {
try {
url=new URL(duongdan);
connection=url.openConnection();
is=connection.getInputStream();
MySaxParser mySaxParser=new MySaxParser();
exrateLists=mySaxParser.XMLparse(is);
//
datetime=exrateLists.get(0).getDatetime();
for(int i=0;i<exrateLists.size();i++) {
macode+=exrateLists.get(i).getExrate().getCurrencyCode();
tencode+= exrateLists.get(i).getExrate().getCurrencyName()+"\n";
mua+= exrateLists.get(i).getExrate().getBuy();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
ngay.setText(datetime);
chuoi.setText(macode+" "+tencode+" "+mua);
}
}
}
我已经使用 simple framework 向这个例子展示了如何阅读 xml 标签。
创建两个 类,这将帮助我们创建将充当模型 类 的对象。
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Root;
/**
* Created by Pankaj Nimgade on 29-01-2016.
*/
@Root (name = "Exrate", strict = false)
public class Exrate {
@Attribute(required = false)
private String CurrencyCode;
@Attribute(required = false)
private String CurrencyName;
@Attribute(required = false)
private String Buy;
@Attribute(required = false)
private String Transfer;
@Attribute(required = false)
private String Sell;
public Exrate() {
}
public Exrate(String currencyCode, String currencyName, String buy, String transfer, String sell) {
CurrencyCode = currencyCode;
CurrencyName = currencyName;
Buy = buy;
Transfer = transfer;
Sell = sell;
}
public String getCurrencyCode() {
return CurrencyCode;
}
public String getCurrencyName() {
return CurrencyName;
}
public String getBuy() {
return Buy;
}
public String getTransfer() {
return Transfer;
}
public String getSell() {
return Sell;
}
}
ExrateList
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import java.util.List;
/**
* Created by Pankaj Nimgade on 29-01-2016.
*/
@Root (name = "ExrateList", strict = false)
public class ExrateList {
@Element(required = false)
private String DateTime;
@ElementList (inline = true,required= false)
private List<Exrate> Exrate;
@Element(required = false)
private String Source;
public ExrateList() {
}
public ExrateList(String dateTime, String source) {
DateTime = dateTime;
Source = source;
}
public String getDateTime() {
return DateTime;
}
public List<Exrate> getList() {
return Exrate;
}
public String getSource() {
return Source;
}
}
现在您可以测试代码了
public class ReadXML {
public static void main(String[] args) {
try {
Path paths = Paths.get("");
String project_Path = paths.toAbsolutePath().toString();
System.out.println("" + project_Path);
File file = new File(project_Path + "\excel_files\some.xml");
Serializer serializer = new Persister();
ExrateList example = serializer.read(ExrateList.class, file);
System.out.println("" + example.getDateTime());
for (Exrate exrate:example.getList()) {
System.out.println(""+exrate.getCurrencyName()+"\t "+exrate.getCurrencyCode()+"\t "+exrate.getTransfer()+"\t "+exrate.getBuy()+"\t "+exrate.getSell());
}
System.out.println("" + example.getSource());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Outout
1/29/2016 4:11:40 PM
AUST.DOLLAR AUD 15731.66 15637.27
CANADIAN DOLLAR CAD 15768.98 15627.06
SWISS FRANCE CHF 21700.14 21548.24
DANISH KRONE DKK 3191.26 0
EURO EUR 24068.25 23996.05
BRITISH POUND GBP 31737.38 31515.22
HONGKONG DOLLAR HKD 2831.9 2812.08
INDIAN RUPEE INR 320.61 0
JAPANESE YEN JPY 182.95 181.12
SOUTH KOREAN WON KRW 18.48 0
KUWAITI DINAR KWD 72009.45 0
MALAYSIAN RINGGIT MYR 5340.84 0
NORWEGIAN KRONER NOK 2536.44 0
RUSSIAN RUBLE RUB 267.7 0
SAUDI RIAL SAR 5745.75 0
SWEDISH KRONA SEK 2573.7 0
SINGAPORE DOLLAR SGD 15520.44 15411.8
THAI BAHT THB 609.21 609.21
US DOLLAR USD 22165 22165
Joint Stock Commercial Bank for Foreign Trade of Vietnam - Vietcombank
我想从 XML 文件中获取数据:https://www.vietcombank.com.vn/exchangerates/ExrateXML.aspx
错误是我可以获得最后一个元素 USD 并传递其他元素。请帮助我
这是我的全部class: Exrate.java
public class Exrate {
String CurrencyCode;
String CurrencyName;
String Buy;
String Transfer;
String Sell;
public Exrate(){}
public String getCurrencyCode() {
return CurrencyCode;
}
public void setCurrencyCode(String CurrencyCode) {
this.CurrencyCode = CurrencyCode;
}
//
public String getCurrencyName(){
return CurrencyName;
}
public void setCurrencyName(String CurrencyName){
this.CurrencyName=CurrencyName;
}
//
public String getBuy(){
return Buy;
}
public void setBuy(String Buy ){
this.Buy=Buy;
}
//
public String getTransfer(){
return Transfer;
}
public void setTransfer(String Transfer ){
this.Transfer=Transfer;
}
//
public String getSell(){
return Sell;
}
public void setSell(String Sell ){
this.Sell=Sell;
}
}
ExrateList.java
public class ExrateList {
String Datetime;
Exrate exrate;
public ExrateList(){}
public String getDatetime(){
return Datetime;
}
public void setDatetime(String DateTime){
this.Datetime=DateTime;
}
//
public Exrate getExrate(){
return exrate;
}
public void setExrate(Exrate exrate){
this.exrate=exrate;
}
}
SaxHandler.java
public class SaxHandler extends DefaultHandler {
String reading;
ArrayList<ExrateList> exrateLists;
ExrateList exrateList;
Exrate exrate;
public SaxHandler() {
exrateLists = new ArrayList<ExrateList>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("ExrateList")){
exrateLists=new ArrayList<>();
exrateList=new ExrateList();
}
if (qName.equalsIgnoreCase("Exrate")){
exrate=new Exrate();
exrate.setCurrencyCode(attributes.getValue("CurrencyCode"));
exrate.setCurrencyName(attributes.getValue("CurrencyName"));
exrate.setBuy(attributes.getValue("Buy"));
exrate.setTransfer(attributes.getValue("Transfer"));
exrate.setSell(attributes.getValue("Sell"));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("ExrateList")){
if (exrateLists!=null){
exrateLists.add(exrateList);
exrateList=null;
}
}
if (qName.equalsIgnoreCase("DateTime")){
exrateList.setDatetime(reading);
}
else if (qName.equalsIgnoreCase("Exrate")){
exrateList.setExrate(exrate);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
reading=new String(ch, start, length);
}
public List<ExrateList> getExrateLists() {
return exrateLists;
}
}
MySaxParser.java
public class MySaxParser {
public List<ExrateList> XMLparse(InputStream is) {
List<ExrateList> exrateLists = null;
try {
// create a XMLReader from SAXParser
XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
// create a SAXXMLHandler
SaxHandler saxHandler = new SaxHandler();
// store handler in XMLReader
xmlReader.setContentHandler(saxHandler);
// the process starts
xmlReader.parse(new InputSource(is));
// get the `Employee list`
exrateLists =saxHandler.getExrateLists();
} catch (Exception ex) {
Log.d("XML", "SAXXMLParser: parse() failed");
}
// return Employee list
return exrateLists;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
TextView ngay, chuoi;
String duongdan = "https://www.vietcombank.com.vn/exchangerates/ExrateXML.aspx";
List<ExrateList> exrateLists = new ArrayList<ExrateList>();
String datetime;
String macode="";
String tencode="";
String mua="";
InputStream is;
URL url;
URLConnection connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ngay = (TextView) findViewById(R.id.textView);
chuoi = (TextView) findViewById(R.id.textView2);
Task a=new Task();
a.execute();
}
class Task extends AsyncTask<Void,Void,Void>
{
@Override
protected Void doInBackground(Void... params) {
try {
url=new URL(duongdan);
connection=url.openConnection();
is=connection.getInputStream();
MySaxParser mySaxParser=new MySaxParser();
exrateLists=mySaxParser.XMLparse(is);
//
datetime=exrateLists.get(0).getDatetime();
for(int i=0;i<exrateLists.size();i++) {
macode+=exrateLists.get(i).getExrate().getCurrencyCode();
tencode+= exrateLists.get(i).getExrate().getCurrencyName()+"\n";
mua+= exrateLists.get(i).getExrate().getBuy();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
ngay.setText(datetime);
chuoi.setText(macode+" "+tencode+" "+mua);
}
}
}
我已经使用 simple framework 向这个例子展示了如何阅读 xml 标签。
创建两个 类,这将帮助我们创建将充当模型 类 的对象。
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Root;
/**
* Created by Pankaj Nimgade on 29-01-2016.
*/
@Root (name = "Exrate", strict = false)
public class Exrate {
@Attribute(required = false)
private String CurrencyCode;
@Attribute(required = false)
private String CurrencyName;
@Attribute(required = false)
private String Buy;
@Attribute(required = false)
private String Transfer;
@Attribute(required = false)
private String Sell;
public Exrate() {
}
public Exrate(String currencyCode, String currencyName, String buy, String transfer, String sell) {
CurrencyCode = currencyCode;
CurrencyName = currencyName;
Buy = buy;
Transfer = transfer;
Sell = sell;
}
public String getCurrencyCode() {
return CurrencyCode;
}
public String getCurrencyName() {
return CurrencyName;
}
public String getBuy() {
return Buy;
}
public String getTransfer() {
return Transfer;
}
public String getSell() {
return Sell;
}
}
ExrateList
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import java.util.List;
/**
* Created by Pankaj Nimgade on 29-01-2016.
*/
@Root (name = "ExrateList", strict = false)
public class ExrateList {
@Element(required = false)
private String DateTime;
@ElementList (inline = true,required= false)
private List<Exrate> Exrate;
@Element(required = false)
private String Source;
public ExrateList() {
}
public ExrateList(String dateTime, String source) {
DateTime = dateTime;
Source = source;
}
public String getDateTime() {
return DateTime;
}
public List<Exrate> getList() {
return Exrate;
}
public String getSource() {
return Source;
}
}
现在您可以测试代码了
public class ReadXML {
public static void main(String[] args) {
try {
Path paths = Paths.get("");
String project_Path = paths.toAbsolutePath().toString();
System.out.println("" + project_Path);
File file = new File(project_Path + "\excel_files\some.xml");
Serializer serializer = new Persister();
ExrateList example = serializer.read(ExrateList.class, file);
System.out.println("" + example.getDateTime());
for (Exrate exrate:example.getList()) {
System.out.println(""+exrate.getCurrencyName()+"\t "+exrate.getCurrencyCode()+"\t "+exrate.getTransfer()+"\t "+exrate.getBuy()+"\t "+exrate.getSell());
}
System.out.println("" + example.getSource());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Outout
1/29/2016 4:11:40 PM
AUST.DOLLAR AUD 15731.66 15637.27
CANADIAN DOLLAR CAD 15768.98 15627.06
SWISS FRANCE CHF 21700.14 21548.24
DANISH KRONE DKK 3191.26 0
EURO EUR 24068.25 23996.05
BRITISH POUND GBP 31737.38 31515.22
HONGKONG DOLLAR HKD 2831.9 2812.08
INDIAN RUPEE INR 320.61 0
JAPANESE YEN JPY 182.95 181.12
SOUTH KOREAN WON KRW 18.48 0
KUWAITI DINAR KWD 72009.45 0
MALAYSIAN RINGGIT MYR 5340.84 0
NORWEGIAN KRONER NOK 2536.44 0
RUSSIAN RUBLE RUB 267.7 0
SAUDI RIAL SAR 5745.75 0
SWEDISH KRONA SEK 2573.7 0
SINGAPORE DOLLAR SGD 15520.44 15411.8
THAI BAHT THB 609.21 609.21
US DOLLAR USD 22165 22165
Joint Stock Commercial Bank for Foreign Trade of Vietnam - Vietcombank