如何在android(java)中读取XML [英] How can I read out XML in android(java)

查看:77
本文介绍了如何在android(java)中读取XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个SOAP调用,作为回答,我得到了如下的XML字符串:

I create a SOAP call, as answer I get a XML string like:

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

那么我该如何从android中的xml中读取" ActualAnswer "?

So how do I read out the "ActualAnswer" from that xml in android?

我发现例如: Android中的XML字符串解析?但是它并没有真正说出如何过滤出答案..并且无法使其正常工作..

I found for example this: XML String parsing in Android? but it did not really say how to filter out an answer.. and couldn't get it working..

在C#中,我可以做到这一点,其中xmlanswer是最上面的xml,但在android中找不到它

in C# I could do this, where xmlanswer is the xml on top, but can't figure it in android

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

推荐答案

过去,我创建了一个不错的类来加载和处理XML内容.

In the past, I've created a nice class to load and handle XML content.

从资源文件夹加载的方式:

Usage for loading from the resources folder :

val rootTag=XmlTag.getXmlRootTagOfXmlFileResourceId(context,xmlResId)

或者,如果您在String实例中拥有它:

or, if you have it in a String instance :

val rootTag=XmlTag.getXmlFromString(xmlString)

这是代码:

import android.content.Context
import androidx.annotation.RawRes
import androidx.annotation.XmlRes
import org.xmlpull.v1.XmlPullParser
import org.xmlpull.v1.XmlPullParserFactory
import java.io.StringReader
import java.util.*
import kotlin.collections.ArrayList
import kotlin.collections.HashMap

/**
 * 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)
                            val namespacesCount = xmlParser.getNamespaceCount(xmlParser.depth)
                            val nameSpaceToNameSpacePrefixMap = HashMap<String, String>(namespacesCount)
                            for (i in 0 until namespacesCount) {
                                val prefix: String = xmlParser.getNamespacePrefix(i)
                                val ns: String = xmlParser.getNamespaceUri(i)
                                nameSpaceToNameSpacePrefixMap[ns] = prefix
                            }
                            for (i in 0 until numberOfAttributes) {
                                val attrName = xmlParser.getAttributeName(i)
                                val attrValue = xmlParser.getAttributeValue(i)
                                xmlParser.getNamespaceCount(1)
                                val attributeNamespace: String? = xmlParser.getAttributeNamespace(i)
                                if (attributeNamespace.isNullOrEmpty())
                                    attributes[attrName] = attrValue
                                else {
                                    val prefix = nameSpaceToNameSpacePrefixMap[attributeNamespace]
                                            ?: attributeNamespace
                                    attributes["$prefix:$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
                        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, @XmlRes xmlFileResourceId: Int): XmlTag? {
            val res = context.resources
            val xmlParser = res.getXml(xmlFileResourceId)
            return getXmlRootTagOfXmlPullParser(xmlParser)
        }

        fun getXmlRootTagFromRawResourceId(context: Context, @RawRes xmlFileResourceId: Int): XmlTag? {
            context.resources.openRawResource(xmlFileResourceId).use {
                val factory = XmlPullParserFactory.newInstance()
                factory.isNamespaceAware = true
                val xpp = factory.newPullParser()
                xpp.setInput(it, "utf8")
                return getXmlRootTagOfXmlPullParser(xpp)
            }
        }
    }

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

    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()
    }

}

这篇关于如何在android(java)中读取XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆