Интересно, как я могу получить значения внутри тегов телефонной книги здесь, в моем XML-файле:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<SyncDataResponse>
<Videos>
<PhonebookVideo>
<firstname>V Michael</firstname>
<lastname>V De Leon</lastname>
<Address>V 5, Cat Street</Address>
<FileURL>http://cloud.somedomain.com/jm/26.flv</FileURL>
</PhonebookVideo>
<PhonebookVideo>
<firstname>V John</firstname>
<lastname>V Smith</lastname>
<Address>V 6, Dog Street</Address>
<FileURL>http://cloud.somedomain.com/jm/27.flv</FileURL>
</PhonebookVideo>
</Videos>
<Phonebook>
<PhonebookEntry>
<firstname>Michael</firstname>
<lastname>De Leon</lastname>
<Address>5, Cat Street</Address>
<FileURL>http://www.technobuzz.net/wp-content/uploads/2009/09/Android-Emulator.jpg</FileURL>
</PhonebookEntry>
<PhonebookEntry>
<firstname>John</firstname>
<lastname>Smith</lastname>
<Address>6, Dog Street</Address>
<FileURL>http://www.cellphonehits.net/uploads/2008/10/android_openmoko.jpg</FileURL>
</PhonebookEntry>
<PhonebookEntry>
<firstname>Jember</firstname>
<lastname>Dowry</lastname>
<Address>7, Monkey Street</Address>
<FileURL>http://www.techdigest.tv/android.jpg</FileURL>
</PhonebookEntry>
<PhonebookEntry>
<firstname>Manilyn</firstname>
<lastname>Bulambao</lastname>
<Address>8, Tiger Street</Address>
<FileURL>http://www.ctctlabs.com/staticContent/weblog/xml-android.png</FileURL>
</PhonebookEntry>
</Phonebook>
<Audios>
<PhonebookAudio>
<firstname>A Michael</firstname>
<lastname>A De Leon</lastname>
<Address>A 5, Cat Street</Address>
<FileURL>http://cloud.somedomain.com/jm/a1.mp3</FileURL>
</PhonebookAudio>
<PhonebookAudio>
<firstname>A John</firstname>
<lastname>A Smith</lastname>
<Address>A 6, Dog Street</Address>
<FileURL>http://cloud.somedomain.com/jm/a2.mp3</FileURL>
</PhonebookAudio>
<PhonebookAudio>
<firstname>A Jember</firstname>
<lastname>A Dowry</lastname>
<Address>A 7, Monkey Street</Address>
<FileURL>http://cloud.somedomain.com/jm/a3.mp3</FileURL>
</PhonebookAudio>
</Audios>
</SyncDataResponse>
Мой код:
В моей основной деятельности (ParsingXML.java) у меня есть что-то вроде этого:
/* Create a new TextView to display the parsingresult later. */
TextView tv = new TextView(this);
tv.setText("This is the parsing program...");
try {
/* Create a URL we want to load some xml-data from. */
URL url = new URL("http://cloud.somedomain.com/jm/sampleXML.xml");
url.openConnection();
/* Get a SAXParser from the SAXPArserFactory. */
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
/* Get the XMLReader of the SAXParser we created. */
XMLReader xr = sp.getXMLReader();
/* Create a new ContentHandler and apply it to the XML-Reader*/
ExampleHandler myExampleHandler = new ExampleHandler();
xr.setContentHandler(myExampleHandler);
/* Parse the xml-data from our URL. */
xr.parse(new InputSource(url.openStream()));
/* Parsing has finished. */
/* Our ExampleHandler now provides the parsed data to us. */
List<ParsedExampleDataSet> parsedExampleDataSet = myExampleHandler.getParsedData();
/* Set the result to be displayed in our GUI. */
//tv.setText(parsedExampleDataSet.toString());
String currentFile = null;
String currentFileURL = null;
Iterator i;
i = parsedExampleDataSet.iterator();
ParsedExampleDataSet dataItem;
while(i.hasNext()){
dataItem = (ParsedExampleDataSet) i.next();
tv.append("\n" + dataItem.getfirstname());
tv.append("\n" + dataItem.getlastname());
tv.append("\n" + dataItem.getAddress());
tv.append("\n" + dataItem.getFileURL());
if(dataItem.getparenttag() == "Video"){
currentFile = dataItem.getfirstname() + ".flv";
}else if(dataItem.getparenttag() == "PhoneBook"){
currentFile = dataItem.getfirstname() + ".jpg";
}else if(dataItem.getparenttag() == "Audio"){
currentFile = dataItem.getfirstname() + ".mp3";
}
currentFileURL = dataItem.getFileURL();
startDownload(currentFile, currentFileURL);
}
} catch (Exception e) {
/* Display any Error to the GUI. */
tv.setText("Error: " + e.getMessage());
}
/* Display the TextView. */
this.setContentView(tv);
У меня есть это на моем обработчике (ExampleHandler.java):
private StringBuilder mStringBuilder = new StringBuilder();
private ParsedExampleDataSet mParsedExampleDataSet = new ParsedExampleDataSet();
private List<ParsedExampleDataSet> mParsedDataSetList = new ArrayList<ParsedExampleDataSet>();
// ===========================================================
// Getter & Setter
// ===========================================================
public List<ParsedExampleDataSet> getParsedData() {
return this.mParsedDataSetList;
}
// ===========================================================
// Methods
// ===========================================================
/** Gets be called on opening tags like:
* <tag>
* Can provide attribute(s), when xml was like:
* <tag attribute="attributeValue">*/
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if (localName.equals("PhonebookEntry")) {
this.mParsedExampleDataSet = new ParsedExampleDataSet();
}
}
/** Gets be called on closing tags like:
* </tag> */
@Override
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
if (localName.equals("PhonebookEntry")) {
this.mParsedDataSetList.add(mParsedExampleDataSet);
mParsedExampleDataSet.setparenttag("PhoneBook");
}else if (localName.equals("firstname")) {
mParsedExampleDataSet.setfirstname(mStringBuilder.toString().trim());
}else if (localName.equals("lastname")) {
mParsedExampleDataSet.setlastname(mStringBuilder.toString().trim());
}else if(localName.equals("Address")) {
mParsedExampleDataSet.setAddress(mStringBuilder.toString().trim());
}else if(localName.equals("FileURL")){
mParsedExampleDataSet.setFileURL(mStringBuilder.toString().trim());
}
mStringBuilder.setLength(0);
}
/** Gets be called on the following structure:
* <tag>characters</tag> */
@Override
public void characters(char ch[], int start, int length) {
mStringBuilder.append(ch, start, length);
}
И у меня это для dataSet (ParsedExampleDataSet.java)
private String parenttag = null;
private String firstname = null;
private String lastname=null;
private String Address=null;
private String FileURL=null;
//Parent tag
public String getparenttag() {
return parenttag;
}
public void setparenttag(String parenttag) {
this.parenttag = parenttag;
}
//Firstname
public String getfirstname() {
return firstname;
}
public void setfirstname(String firstname) {
this.firstname = firstname;
}
//Lastname
public String getlastname(){
return lastname;
}
public void setlastname(String lastname){
this.lastname=lastname;
}
//Address
public String getAddress(){
return Address;
}
public void setAddress(String Address){
this.Address=Address;
}
//FileURL
public String getFileURL(){
return FileURL;
}
public void setFileURL(String FileURL){
this.FileURL=FileURL;
}
Вывод этого кода: поскольку в нем 4 записи, ожидается, что он вернет 4 записи.
И да, он вернул 4 записи, но он только правильно извлекает первые три записи
и затем четвертая запись неверна, четвертая запись фактически является записью в теге PhonebookAudio.
Это точно так:
This is the parsing program...
Michael
De Leon
5, Cat Street
http://www.technobuzz.net/wp-content/uploads/2009/09/Android-Emulator.jpg
John
Smith
6, Dog Street
http://www.cellphonehits.net/uploads/2008/10/android_openmoko.jpg
Jember
Dowry
7, Monkey Street
http://www.techdigest.tv/android.jpg
A Jember
A Dowry
A 7, Monkey Street
http://cloud.somedomain.com/jm/a3.mp3
Я новичок в java и android dev, огромное спасибо продвинутым за любую помощь! :)