Android:如何显示相同标记名称的所有XML值

我有ff。 来自URL的XML:

   Michael De Leon 
5, Cat Street
John Smith
6, Dog Street

我想显示两个PhonebookEntry值(名字,姓氏,地址)。 目前,我的代码仅显示John Smith的PhonebookEntry(最后一个条目)。 这是我的代码。

ParsingXML.java

 package com.example.parsingxml; import java.net.Proxy; import java.net.Socket; import java.net.SocketAddress; import java.net.URL; import java.net.URLConnection; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class ParsingXML extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); /* Create a new TextView to display the parsingresult later. */ TextView tv = new TextView(this); try { /* Create a URL we want to load some xml-data from. */ URL url = new URL("http://somedomain.com/jm/sampleXML.xml"); URLConnection ucon = 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. */ ParsedExampleDataSet parsedExampleDataSet = myExampleHandler.getParsedData(); /* Set the result to be displayed in our GUI. */ tv.setText(parsedExampleDataSet.toString()); } catch (Exception e) { /* Display any Error to the GUI. */ tv.setText("Error: " + e.getMessage()); } /* Display the TextView. */ this.setContentView(tv); } } 

ExampleHandler.java

 package com.example.parsingxml; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class ExampleHandler extends DefaultHandler{ // =========================================================== // Fields // =========================================================== private boolean in_outertag = false; private boolean in_innertag = false; private boolean in_firstname = false; private boolean in_lastname= false; private boolean in_Address=false; private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet(); // =========================================================== // Getter & Setter // =========================================================== public ParsedExampleDataSet getParsedData() { return this.myParsedExampleDataSet; } // =========================================================== // Methods // =========================================================== @Override public void startDocument() throws SAXException { this.myParsedExampleDataSet = new ParsedExampleDataSet(); } @Override public void endDocument() throws SAXException { // Nothing to do } /** Gets be called on opening tags like: *  * Can provide attribute(s), when xml was like: * */ @Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { if (localName.equals("PhoneBook")) { this.in_outertag = true; }else if (localName.equals("PhonebookEntry")) { this.in_innertag = true; }else if (localName.equals("firstname")) { this.in_firstname = true; }else if (localName.equals("lastname")) { this.in_lastname= true; }else if(localName.equals("Address")) { this.in_Address= true; } } /** Gets be called on closing tags like: *  */ @Override public void endElement(String namespaceURI, String localName, String qName) throws SAXException { if (localName.equals("Phonebook")) { this.in_outertag = false; }else if (localName.equals("PhonebookEntry")) { this.in_innertag = false; }else if (localName.equals("firstname")) { this.in_firstname = false; }else if (localName.equals("lastname")) { this.in_lastname= false; }else if(localName.equals("Address")) { this.in_Address= false; } } /** Gets be called on the following structure: * characters */ @Override public void characters(char ch[], int start, int length) { if(this.in_firstname){ myParsedExampleDataSet.setfirstname(new String(ch, start, length)); } if(this.in_lastname){ myParsedExampleDataSet.setlastname(new String(ch, start, length)); } if(this.in_Address){ myParsedExampleDataSet.setAddress(new String(ch, start, length)); } } } 

ParsedExampleDataSet.java

 package com.example.parsingxml; public class ParsedExampleDataSet { private String firstname = null; private String lastname=null; private String Address=null; //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; } public String toString(){ return "Firstname: " + this.firstname + "\n" + "Lastname: " + this.lastname + "\n" + "Address: " + this.Address; } } 

我是java和android dev的新手,非常感谢您的任何帮助! 🙂

其他响应已经指出您需要一个列表来存储从XML获取的所有ParsedExampleDataSet对象。

但是我想把你的注意力转向另一件关于XML处理程序的事情,它可能会在以后(并随机)咬你。 字符方法不是分配XML中标记之间的值的好地方,因为不能保证字符方法一次性返回元素中的所有字符。 可以在同一元素中多次调用它来报告到目前为止找到的字符。 通过现在的实施,您将最终得到丢失的数据,并想知道发生了什么。

也就是说,我会用它来使用StringBuilder来累积你的字符,然后在endElement(...)调用中分配它们。 像这样:

 public class ExampleHandler extends DefaultHandler{ // =========================================================== // Fields // =========================================================== private StringBuilder mStringBuilder = new StringBuilder(); private ParsedExampleDataSet mParsedExampleDataSet = new ParsedExampleDataSet(); private List mParsedDataSetList = new ArrayList(); // =========================================================== // Getter & Setter // =========================================================== public List getParsedData() { return this.mParsedDataSetList; } // =========================================================== // Methods // =========================================================== /** Gets be called on opening tags like: *  * Can provide attribute(s), when xml was like: * */ @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: *  */ @Override public void endElement(String namespaceURI, String localName, String qName) throws SAXException { if (localName.equals("PhonebookEntry")) { this.mParsedDataSetList.add(mParsedExampleDataSet); }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()); } mStringBuilder.setLength(0); } /** Gets be called on the following structure: * characters */ @Override public void characters(char ch[], int start, int length) { mStringBuilder.append(ch, start, length); } } 

然后,您可以在活动中检索ParsedExampleDataSets列表,并在多个文本视图中显示或仅在一个文本视图中显示。 您的Activity.onCreate(...)方法可能如下所示:

 /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); /* Create a new TextView to display the parsingresult later. */ TextView tv = new TextView(this); try { /* Create a URL we want to load some xml-data from. */ URL url = new URL("http://somedomain.com/jm/sampleXML.xml"); URLConnection ucon = url.openConnection(); /* Create a new ContentHandler and apply it to the XML-Reader*/ ExampleHandler myExampleHandler = new ExampleHandler(); //remember to import android.util.Xml Xml.parse(url.openStream(), Xml.Encoding.UTF_8, myExampleHandler); /* Our ExampleHandler now provides the parsed data to us. */ List parsedExampleDataSetList = myExampleHandler.getParsedData(); /* Set the result to be displayed in our GUI. */ for(ParsedExampleDataSet parsedExampleDataSet : parsedExampleDataSetList){ tv.append(parsedExampleDataSet.toString()); } } catch (Exception e) { /* Display any Error to the GUI. */ tv.setText("Error: " + e.getMessage()); } /* Display the TextView. */ this.setContentView(tv); } 

您的处理程序中只有一个ParsedExampleDataSet对象,因此只能存储一个条目。 将ExampleHandler更改为具有ArrayList results以及ParsedExampleDataSet currentSet 。 在startElement内部,当您看到PhoneBook标记时,将currentSet设置为ParsedExampleDataSet的新实例并将其添加到results 。 解析后, results应包含您想要的所有内容。

你很亲密 由于你有很多PhoneBookeEntrys你需要将它们存储在某个地方:

 public class ExampleHandler extends DefaultHandler{ // =========================================================== // Fields // =========================================================== private boolean in_outertag = false; private boolean in_innertag = false; private boolean in_firstname = false; private boolean in_lastname= false; private boolean in_Address=false; private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet(); private List allSets = new ArrayList(); // =========================================================== // Getter & Setter // =========================================================== public ParsedExampleDataSet getParsedData() { return this.myParsedExampleDataSet; } // =========================================================== // Methods // =========================================================== /** Gets be called on opening tags like: *  * Can provide attribute(s), when xml was like: * */ @Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { if (localName.equals("PhoneBook")) { this.in_outertag = true; }else if (localName.equals("PhonebookEntry")) { this.in_innertag = true; this.myParsedExampleDataSet = new ParsedExampleDataSet(); }else if (localName.equals("firstname")) { this.in_firstname = true; }else if (localName.equals("lastname")) { this.in_lastname= true; }else if(localName.equals("Address")) { this.in_Address= true; } } /** Gets be called on closing tags like: *  */ @Override public void endElement(String namespaceURI, String localName, String qName) throws SAXException { if (localName.equals("Phonebook")) { this.in_outertag = false; }else if (localName.equals("PhonebookEntry")) { this.in_innertag = false; allSets.add(myParsedExampleDataSet); }else if (localName.equals("firstname")) { this.in_firstname = false; }else if (localName.equals("lastname")) { this.in_lastname= false; }else if(localName.equals("Address")) { this.in_Address= false; } } /** Gets be called on the following structure: * characters */ @Override public void characters(char ch[], int start, int length) { if(this.in_firstname){ myParsedExampleDataSet.setfirstname(new String(ch, start, length)); } if(this.in_lastname){ myParsedExampleDataSet.setlastname(new String(ch, start, length)); } if(this.in_Address){ myParsedExampleDataSet.setAddress(new String(ch, start, length)); } } } 

我在这里找到了一个XML教程,并对其进行了编辑以使用您的XML文件。 以下是代码。 为了在我的机器上测试它,我从本地文件而不是在线获取XML文件,但是它不应该太难以解决。

这应该有希望指出你正确的方向。

 package phonebook; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class program { public static void main(String argv[]) { try { File file = new File("phonebook.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(file); doc.getDocumentElement().normalize(); System.out.println("Root element " + doc.getDocumentElement().getNodeName()); NodeList nodeLst = doc.getElementsByTagName("PhonebookEntry"); System.out.println("Information of all entries"); for (int s = 0; s < nodeLst.getLength(); s++) { Node fstNode = nodeLst.item(s); if (fstNode.getNodeType() == Node.ELEMENT_NODE) { Element fstElmnt = (Element) fstNode; // Firstname NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("firstname"); Element fstNmElmnt = (Element) fstNmElmntLst.item(0); NodeList fstNm = fstNmElmnt.getChildNodes(); System.out.println("First Name : " + ((Node) fstNm.item(0)).getNodeValue()); // Lastname NodeList lstNmElmntLst = fstElmnt.getElementsByTagName("lastname"); Element lstNmElmnt = (Element) lstNmElmntLst.item(0); NodeList lstNm = lstNmElmnt.getChildNodes(); System.out.println("Last Name : " + ((Node) lstNm.item(0)).getNodeValue()); // Address NodeList addrNmElmntLst = fstElmnt.getElementsByTagName("Address"); Element addrNmElmnt = (Element) addrNmElmntLst.item(0); NodeList addrNm = addrNmElmnt.getChildNodes(); System.out.println("Address : " + ((Node) addrNm.item(0)).getNodeValue()); } } } catch (Exception e) { e.printStackTrace(); } } }