当前位置: 首页 > 面试题库 >

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

梁俊智
2023-03-14
问题内容

我有事。URL中的XML:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<Phonebook>
    <PhonebookEntry>
        <firstname>Michael</firstname> 
        <lastname>De Leon</lastname> 
        <Address>5, Cat Street</Address> 
    </PhonebookEntry>
    <PhonebookEntry>
        <firstname>John</firstname> 
        <lastname>Smith</lastname> 
        <Address>6, Dog Street</Address> 
    </PhonebookEntry>
</Phonebook>

我想同时显示两个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:
      * <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("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:
      * </tag> */
     @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:
      * <tag>characters</tag> */
     @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开发的新手,在此先感谢您的帮助!:)


问题答案:

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

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

就是说,我将使用a StringBuilder来积累您的字符,然后在endElement(...)通话中分配它们。像这样:

public class ExampleHandler extends DefaultHandler{

 // ===========================================================
 // Fields
 // ===========================================================

 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);
      }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:
  * <tag>characters</tag> */
 @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<ParsedExampleDataSet> 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);
    }


 类似资料:
  • 我无法在这里解析XML。它只返回“Item” 由于我的AndroidActivity非常大,因此无法显示。这就是为什么我只展示了负责解析的部分。 我的 XML 看起来像这样: 我的活动类方法: 我的XML分析器类: 我不能在这里解析我的XML。这里的问题是什么?< br >它只返回“Item”。< br >在我的< code>ActivityClass中,特别是在代码的这一部分,我需要做什么?

  • 我创建了一个java程序来创建一个预订系统,我必须创建一个GUI。在GUI中,我创建了具有相同对象名称的多个标签。我为此使用了gridPane Layout。 现在,我想删除所有这些标签并重新创建新标签,但当我尝试这样做时:

  • 问题内容: 使用Jenkins 2 Pipeline插件,它具有一项有用的功能,可以快速概述管道阶段和步骤状态,包括记录输出。 但是,如果您使用“ Shell脚本”(sh)步骤,似乎没有一种用有用的名称标记该脚本的方法,因此显示内容仅显示一长串“ ShellScript”。 如何分配有用的名称,或者如何使用其他步骤来达到相同的效果? 问题答案: 2019年2月更新 : 根据gertvdijk在下面

  • 问题内容: 我有两个列表,当我用下面的代码绘图时,x轴只显示 最多12个(最多15个)。我可以知道如何显示x列表中的所有值吗 x轴?提前谢谢。 如果我在“set xticklabels”函数中设置minor=True,它将显示所有 x=2,4,6,8,…,16。。。但我想要所有的价值观。 P、 我的x轴没有排序,应该显示如图所示。 问题答案: Add this: To your code befo

  • 问题内容: 给定上面的xml文件,我将如何检索标签内所有标签的列表?我想获取“名称”的所有值以及标签之间的数字值。像这样: 问题是我不知道会有多少个附加标签。可能没有,也可能有20。我需要某种方法来对它们全部进行计数,然后删除信息。 问题答案: 这是一个使用JDK执行查询的示例。它假定变量包含您的XML文档。

  • 使用Jenkins 2管道插件,有一个有用的功能,允许快速概述管道阶段和步骤状态,包括日志输出。 但是,如果您使用“Shell脚本”(sh)步骤,似乎没有办法用有用的名称来标记该脚本,因此显示屏仅显示一长串“Shell脚本”(如下图所示)。 如何指定一个有用的名称,或者如何使用其他步骤来实现相同的效果?