Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.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
通过python xpath获取android清单元数据值_Python_Xpath - Fatal编程技术网

通过python xpath获取android清单元数据值

通过python xpath获取android清单元数据值,python,xpath,Python,Xpath,我得到: import lxml.etree as ET import os ns='{http://schemas.android.com/apk/res/android}' nametag=ns+'name' categorytag='category' packagetag='package' class XmlParser: def __init__(self, file): self.file = file self.tree = None

我得到:

import lxml.etree as ET
import os
ns='{http://schemas.android.com/apk/res/android}'
nametag=ns+'name'
categorytag='category'
packagetag='package'

class XmlParser:
    def __init__(self, file):
        self.file = file
        self.tree = None
        self.root = None

    def __parse(self):
        if self.tree is None or self.root is None:
            parser = ET.XMLParser(strip_cdata=False)
            self.tree = ET.parse(self.file, parser)
            self.root = self.tree.getroot()

    def gettree(self):
        self.__parse()
        return self.tree

    def getroot(self):
        self.__parse()
        return self.root

def get_meta_data(parser):
    tree = parser.gettree()
    #value = tree.xpath('/manifest/application//meta-data[@*=\'OTA_TYPE\']/@*[2]')
    NS = {'android' : 'http://schemas.android.com/apk/res/android'}
    value = tree.xpath('/manifest/application/meta-data[@a:name=\'OTA_TYPE\']/@a:value', namespace=NS)
    print '%s' %(value)
    return value

if __name__ == '__main__':
    file = os.environ['PYTHON_ARG']
    parser = XmlParser(file)
    meta_data = get_meta_data(parser)
    print '%s' %(meta_data)
应用


我不希望括号中有引号。

树的
参数xpath
名称空间
,而不是
名称空间
。因此:

value = tree.xpath('/manifest/application//meta-data[@*=\'OTA_TYPE\']/@*[2]')

还要注意,您在
NS
字典中使用了
android
键,但在查询中使用了
a:
。上面的示例更正了字典,使其与您正在使用的前缀匹配。

树的
参数。xpath
名称空间
,而不是
名称空间
。因此:

value = tree.xpath('/manifest/application//meta-data[@*=\'OTA_TYPE\']/@*[2]')
NS = {'a' : 'http://schemas.android.com/apk/res/android'}
value = tree.xpath('/manifest/application/'
                   'meta-data[@a:name=\'OTA_TYPE\']/@a:value',
                   namespaces=NS)

还要注意,您在
NS
字典中使用了
android
键,但在查询中使用了
a:
。上面的示例更正了字典,使其与您使用的前缀匹配。

您是对的,但它仍然打印['daily\u build\u test',我发现了原因,即:value是一个列表,NS={'a':'}value=tree.xpath('/manifest/application/''meta data[@a:name=\'OTA\u TYPE\']/@a:value',namespaces=NS)value[0]是我想要的。你是对的,它仍然打印['daily\u build\u test',我找到了原因,那就是:value是一个列表,NS={'a':'}value=tree.xpath('/manifest/application/''meta data[@a:name=\'OTA\u TYPE\']/@a:value',namespaces=NS)value[0]这就是我想要的。
NS = {'a' : 'http://schemas.android.com/apk/res/android'}
value = tree.xpath('/manifest/application/'
                   'meta-data[@a:name=\'OTA_TYPE\']/@a:value',
                   namespaces=NS)
Thanks to larsks, I finally get I want by:*


def get_meta_data(parser):
    tree = parser.gettree()
    NS = {'a' : 'http://schemas.android.com/apk/res/android'}
    value = tree.xpath('/manifest/application/meta-data[@a:name=\'OTA_TYPE\']/@a:value', namespaces=NS)
    print '%s' %(value[0]) 
    # NOTE value is a list of length 0.
    return value[0]