如何在android(java)中读取XML [英] How can I read out XML in android(java)
问题描述
我创建了一个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屋!