2013-10-01 2 views
1

создать вызов SOAP, как ответ я получаю XML строку типа:Как я могу читать из XML в Android (Java)

<?xml version="1.0" encoding="utf-8"?> 
<sopenevelop> 
    <soapbody> 
     <ActualAnswer> I want to get whatever is in here </ActualAnswer> 
    </soapbody> 
</sopenevelop> 

Так как я зачитал «ActualAnswer» от xml в android?

я нашел, например, это: XML String parsing in Android? но это на самом деле не сказать, как отфильтровать ответ .. и не мог заставить его работать ..

в C# я мог бы сделать это, где xmlanswer является XML-сверху, но не может понять его в андроиде

XmlDocument xml = new XmlDocument(); 
xml.LoadXml (xmlanswer); 
string loginanswer = (xml.GetElementsByTagName ("ActualAnswer") [0].InnerText); 
+0

проверка [это ] (http://stackoverflow.com/questions/4413051/parse-xml-retrieve-info-several-layers-of-nodes-deep-java-android?rq=1) для получения дополнительной информации –

+0

ответьте ей http://stackoverflow.com/questions/5534956/reading-xml-with-android – Sitansu

ответ

1

В прошлом , Я создал хороший класс для загрузки и обработки XML-контента.

Использование для загрузки из папки ресурсов:

val rootTag=XmlTag.getXmlRootTagOfXmlFileResourceId(context,xmlResId) 

или, если у вас есть в экземпляре Струнный:

val rootTag=XmlTag.getXmlFromString(xmlString) 

вот код:

/** 
* an xml tag , includes its name, value and attributes 
* @param tagName the name of the xml tag . for example : <a>b</a> . the name of the tag is "a" 
*/ 
class XmlTag(val tagName: String) { 
    /** a hashmap of all of the tag attributes. example: <a c="d" e="f">b</a> . attributes: {{"c"="d"},{"e"="f"}}  */ 
    @JvmField 
    var tagAttributes: HashMap<String, String>? = null 
    /**list of inner text and xml tags*/ 
    @JvmField 
    var innerTagsAndContent: ArrayList<Any>? = null 

    companion object { 
     @JvmStatic 
     fun getXmlFromString(input: String): XmlTag? { 
      val factory = XmlPullParserFactory.newInstance() 
      factory.isNamespaceAware = true 
      val xpp = factory.newPullParser() 
      xpp.setInput(StringReader(input)) 
      return getXmlRootTagOfXmlPullParser(xpp) 
     } 

     @JvmStatic 
     fun getXmlRootTagOfXmlPullParser(xmlParser: XmlPullParser): XmlTag? { 
      var currentTag: XmlTag? = null 
      var rootTag: XmlTag? = null 
      val tagsStack = Stack<XmlTag>() 
      xmlParser.next() 
      var eventType = xmlParser.eventType 
      var doneParsing = false 
      while (eventType != XmlPullParser.END_DOCUMENT && !doneParsing) { 
       when (eventType) { 
        XmlPullParser.START_DOCUMENT -> { 
        } 
        XmlPullParser.START_TAG -> { 
         val xmlTagName = xmlParser.name 
         currentTag = XmlTag(xmlTagName) 
         if (tagsStack.isEmpty()) 
          rootTag = currentTag 
         tagsStack.push(currentTag) 
         val numberOfAttributes = xmlParser.attributeCount 
         if (numberOfAttributes > 0) { 
          val attributes = HashMap<String, String>(numberOfAttributes) 
          for (i in 0 until numberOfAttributes) { 
           val attrName = xmlParser.getAttributeName(i) 
           val attrValue = xmlParser.getAttributeValue(i) 
           attributes[attrName] = attrValue 
          } 
          currentTag.tagAttributes = attributes 
         } 
        } 
        XmlPullParser.END_TAG -> { 
         currentTag = tagsStack.pop() 
         if (!tagsStack.isEmpty()) { 
          val parentTag = tagsStack.peek() 
          parentTag.addInnerXmlTag(currentTag) 
          currentTag = parentTag 
         } else 
          doneParsing = true 
        } 
        XmlPullParser.TEXT -> { 
         val innerText = xmlParser.text 
         if (currentTag != null) 
          currentTag.addInnerText(innerText) 
        } 
       } 
       eventType = xmlParser.next() 
      } 
      return rootTag 
     } 

     /**returns the root xml tag of the given xml resourceId , or null if not succeeded . */ 
     fun getXmlRootTagOfXmlFileResourceId(context: Context, xmlFileResourceId: Int): XmlTag? { 
      val res = context.resources 
      val xmlParser = res.getXml(xmlFileResourceId) 
      return getXmlRootTagOfXmlPullParser(xmlParser) 
     } 
    } 

    private fun addInnerXmlTag(tag: XmlTag) { 
     if (innerTagsAndContent == null) 
      innerTagsAndContent = ArrayList() 
     innerTagsAndContent!!.add(tag) 
    } 

    private fun addInnerText(str: String) { 
     if (innerTagsAndContent == null) 
      innerTagsAndContent = ArrayList() 
     innerTagsAndContent!!.add(str) 
    } 

    /**formats the xmlTag back to its string format,including its inner tags  */ 
    override fun toString(): String { 
     val sb = StringBuilder() 
     sb.append("<").append(tagName) 
     val numberOfAttributes = if (tagAttributes != null) tagAttributes!!.size else 0 
     if (numberOfAttributes != 0) 
      for ((key, value) in tagAttributes!!) 
       sb.append(" ").append(key).append("=\"").append(value).append("\"") 
     val numberOfInnerContent = if (innerTagsAndContent != null) innerTagsAndContent!!.size else 0 
     if (numberOfInnerContent == 0) 
      sb.append("/>") 
     else { 
      sb.append(">") 
      for (innerItem in innerTagsAndContent!!) 
       sb.append(innerItem.toString()) 
      sb.append("</").append(tagName).append(">") 
     } 
     return sb.toString() 
    } 

} 
0
SoapEnvelope result = (SoapEnvelope) envelope.getResponse(); 
Log.d("result : ", "" + result.toString()); 
String property_name= result.getProperty("ActualAnswer").toString(); 

или Вы можете получить его по индексу, как следующим образом:

String property_name= result.getProperty(0).toString(); 
+0

Итак, откуда вы взяли «obj»? .. – Onno

+0

его предложение SoapEnvelope см. Обновленный ответ – Basbous

+0

Но «SoapEnvelope» не известно eclipse .. он говорит мне создать новый класс – Onno

0

Попробуйте это с помощью DOM

public static String checkLoginStatus(String response) 
     throws ParserConfigurationException, SAXException, IOException { 
    String status = ""; 
    DocumentBuilder db = DocumentBuilderFactory.newInstance() 
      .newDocumentBuilder(); 
    InputSource is = new InputSource(); 
    Document doc = null; 

    is.setCharacterStream(new StringReader(response)); 

    try { 
     doc = db.parse(is); 
    } catch (SAXException e) { 
     Log.d("Wrong XML file structure: ", e.getMessage()); 
     e.printStackTrace(); 
     throw e; 

    } catch (IOException e) { 
     Log.d("I/O exeption: ", e.getMessage()); 
     e.printStackTrace(); 
     throw e; 
    } 

    Node rootNode = doc.getElementsByTagName("soapbody").item(0); 
    Element rootElement = (Element) rootNode; 
    String status = getTagValue("ActualAnswer", rootElement); 
    Log.d("StatusCode", status); 
    return status; 
} 

public static String getTagValue(String sTag, Element eElement) { 
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0) 
      .getChildNodes(); 
    Node nValue = (Node) nlList.item(0); 
    if (nValue == null) { 
     return ""; 
    } else { 
     return nValue.getNodeValue(); 
    } 
} 
+0

А как насчет функции «getTagValue»? – Onno

+0

обновленный ответ прямо сейчас – Developer

+0

@Onno получил решение или нет – Developer

Смежные вопросы