【问题标题】:How can I read out XML in android(java)如何在 android(java) 中读取 XML
【发布时间】:2013-10-07 11:44:17
【问题描述】:

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

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

那么我如何从 android 中的那个 xml 中读出“ActualAnswer”?

我发现例如: XML String parsing in Android? 但它并没有真正说明如何过滤掉答案..并且无法使其正常工作..

在 C# 中我可以做到这一点,其中 xmlanswer 是顶部的 xml,但在 android 中无法计算

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

【问题讨论】:

标签: java android xml


【解决方案1】:

如果你想使用 jDom...

http://www.mkyong.com/java/how-to-read-xml-file-in-java-jdom-example/

PS:在 linux 上不工作...

【讨论】:

    【解决方案2】:
    SoapEnvelope result = (SoapEnvelope) envelope.getResponse();
    Log.d("result : ", "" + result.toString());
    String property_name= result.getProperty("ActualAnswer").toString();
    

    或者您可以通过索引获取它,如下所示:

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

    【讨论】:

    • 但是 Eclipse 不知道“SoapEnvelope”.. 它告诉我创建一个新类
    【解决方案3】:

    通过 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();
        }
    }
    

    【讨论】:

    • 那么函数“getTagValue”呢?
    • @Onno 有没有解决办法
    • 它对我来说就像宝石一样工作。发布您的更多代码后会有其他问题
    【解决方案4】:

    过去,我创建了一个很好的类来加载和处理 XML 内容。

    用于从资源文件夹加载:

    val rootTag=XmlTag.getXmlRootTagOfXmlFileResourceId(context,xmlResId)
    

    或者,如果你有一个字符串实例:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-27
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      相关资源
      最近更新 更多