Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android(java)中读取XML_Java_Android_Xml - Fatal编程技术网

如何在android(java)中读取XML

如何在android(java)中读取XML,java,android,xml,Java,Android,Xml,我创建了一个SOAP调用,作为回答,我得到一个XML字符串,如: <?xml version="1.0" encoding="utf-8"?> <sopenevelop> <soapbody> <ActualAnswer> I want to get whatever is in here </ActualAnswer> </soapbody> </sopenevelop>

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

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

如果您想


注:在linux上不工作…

如果您想

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

PS:在linux上不工作

SoapEnvelope result = (SoapEnvelope) envelope.getResponse();
Log.d("result : ", "" + result.toString());
String property_name= result.getProperty("ActualAnswer").toString();
或者,您可以通过如下索引获得:

String property_name= result.getProperty(0).toString();
或者,您可以通过如下索引获得:

String property_name= result.getProperty(0).toString();
试试这个

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();
    }
}
试试这个

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

在过去,我创建了一个很好的类来加载和处理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()
    }

}

导入android.content.Context
导入androidx.annotation.RawRes
导入androidx.annotation.XmlRes
导入org.xmlpull.v1.XmlPullParser
导入org.xmlpull.v1.XmlPullParserFactory
导入java.io.StringReader
导入java.util*
导入kotlin.collections.ArrayList
导入kotlin.collections.HashMap
/**
*xml标记,包括其名称、值和属性
*@param标记名xml标记名的名称。例如:b。标签的名称为“a”
*/
类XmlTag(val标记名:字符串){
/**所有标记属性的哈希映射。例如:b.属性:{{“c”=“d”},{“e”=“f”}*/
@JvmField
var tagAttributes:HashMap?=null
/**内部文本和xml标记的列表*/
@JvmField
var innerTagsAndContent:ArrayList?=null
伴星{
@JvmStatic
有趣的getXmlFromString(输入:String):XmlTag{
val factory=XmlPullParserFactory.newInstance()
factory.isNamespaceAware=true
val xpp=factory.newPullParser()
xpp.setInput(StringReader(输入))
返回getXmlRootTagOfXmlPullParser(xpp)
}
@JvmStatic
有趣的getXmlRootTagOfXmlPullParser(xmlParser:XmlPullParser):XmlTag{
var currentTag:XmlTag?=null
var rootTag:XmlTag?=null
val tagsStack=Stack()
xmlParser.next()
var eventType=xmlParser.eventType
var doneParsing=错误
while(eventType!=XmlPullParser.END_DOCUMENT&&!doneParsing){
何时(事件类型){
XmlPullParser.START_文档->{
}
XmlPullParser.START_标记->{
val xmlTagName=xmlParser.name
currentTag=XmlTag(xmlTagName)
if(tagsStack.isEmpty())
rootTag=currentTag
tagsStack.push(当前标签)
val numberOfAttributes=xmlParser.attributeCount
如果(numberOfAttributes>0){
val attributes=HashMap(numberOfAttributes)
val namespacesunt=xmlParser.getnamespacecont(xmlParser.depth)
val nameSpaceToNameSpacePrefixMap=HashMap(namespacesunt)
for(在0中输入i,直到NamespaceScont){
val前缀:String=xmlParser.getNamespacePrefix(i)
val ns:String=xmlParser.getNamespaceUri(i)
NamespaceTonNamespacePrefixMap[ns]=前缀
}
for(i在0中,直到numberOfAttributes){
val attrName=xmlParser.getAttributeName(i)
val attrValue=xmlParser.getAttributeValue(i)
xmlParser.getNamespaceCount(1)
val attributeNamespace:String?=xmlParser.getAttributeNamespace(i)
if(attributeNamespace.isNullOrEmpty())
属性[attrName]=属性值
否则{
val prefix=NamespaceTonNamespacePrefixMap[attributeNamespace]
?:属性空间
属性[“$prefix:$attrName”]=attrValue
}
}
currentTag.tagAttributes=属性
}
}
XmlPullParser.END_标记->{
currentTag=tagsStack.pop()
如果(!tagsStack.isEmpty()){
val parentTag=tagsStack.peek()
parentTag.addInnerXmlTag(currentTag)
currentTag=parentTag
}否则
doneParsing=true
}
XmlPullParser.TEXT->{
val innerText=xmlParser.text
currentTag?.addInnerText(innerText)
}
}
eventType=xmlParser.next()
}
返回根标记
}
/**返回给定xml resourceId的根xml标记,如果未成功,则返回null*/
有趣的getXmlRootTagOfXmlFileResourceId(context:context,@XmlRes xmlFileResourceId:Int):XmlTag{
val res=context.resources
val xmlParser=res.getXml(xmlFileResourceId)
返回getXmlRootTagOfXmlPullParser(xmlParser)
}
有趣的getXmlRootTagFromRawResourceId(context:context,@RawRes xmlFileResourceId:Int):XmlTag{
context.resources.openRawResource(xmlFileResourceId)。使用{
val factory=XmlPullParserFactory.newInstance()
factory.isNamespaceAware=true
val xpp=factory.newPullParser()
xpp.setInput(它是“utf8”)
返回getXmlRootTagOfXmlPullParser(xpp)
}
}
}
趣味addInnerXmlTag(标记:XmlTag){
if(innerTagsAndContent==null)
innerTagsAndContent=ArrayList()
InnerTags和Content!!.add(标记)
}
有趣的addInnerText(