如何使用带有文本的lxml获取所有元素的路径

时间:2019-05-08 09:09:56

标签: python xml

我有一个巨大的XML文件,我将完全提取元素的路径及其文本。

我将lxml包与getpath()一起使用,但无法在其中放入文本

XML代码示例:

test.xml文件:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<SDP title="tree">Ehsan
<Node id="defs" type="Defs">
Common Definitions
<Node>Type19 Adv Notification
    <Tariff>HLRDefinition
        <HLRAddress></HLRAddress>
        <StackType>0</StackType>
    </Tariff>
    <Tariff>UssdTextMessage
        <Language>
            <Id>1</Id>
            <Message>Hazine%evaluate($cost,0)Rial,SHEMSHE TALA, jayeze kharid sharj az barname mobily(App) 780,Baraye Nasb App*780*300#0023# ro begir</Message>
        </Language>
        <Language>
            <Id>2</Id>
            <Message>Hazine%evaluate($cost,0)Rial,SHEMSHE TALA, jayeze kharid sharj az barname mobily(App) 780,Baraye Nasb App*780*300#0023# ro begir</Message>
        </Language>
        <Language>
            <Id>3</Id>
            <Message></Message>
        </Language>
        <Language>
            <Id>4</Id>
            <Message></Message>
        </Language>
    </Tariff>
</Node>
<Node>Type20 Adv Notification
    <Tariff>
HLRDefinition
        <HLRAddress></HLRAddress>
        <StackType>1</StackType>
    </Tariff>
    <Tariff>
UssdTextMessage
        <Language>
            <Id>1</Id>
            <Message>#0647##0632##06cc##0646##0647# %evaluate($cost,0)#0631##06cc##0627##0644##060c##0023#300*780*#0631##0648# #0628##06af##06cc##0631# #0637##0644##0627# #0628##0628##0631#</Message>
        </Language>
        <Language>
            <Id>2</Id>
            <Message>#0647##0632##06cc##0646##0647# %evaluate($cost,0)#0631##06cc##0627##0644##060c##0023#300*780*#0631##0648# #0628##06af##06cc##0631# #0637##0644##0627# #0628##0628##0631#</Message>
        </Language>
        <Language>
            <Id>3</Id>
            <Message></Message>
        </Language>
        <Language>
            <Id>4</Id>
            <Message></Message>
        </Language>
    </Tariff>
</Node>
<Node>Type21 Adv Notification
    <Tariff>
HLRDefinition
        <HLRAddress></HLRAddress>
        <StackType>1</StackType>
    </Tariff>
    <Tariff>
UssdTextMessage
        <Language>
            <Id>1</Id>
            <Message>#0647##0632##06cc##0646##0647# %evaluate($cost,0)#0631##06cc##0627##0644##060c##0627##0632##0627##06cc##0646# #067e##0633# #0628##0627##0023#780*#0634##0627##0631##0698##0628##062e##0631#</Message>
        </Language>
        <Language>
            <Id>2</Id>
            <Message>#0647##0632##06cc##0646##0647# %evaluate($cost,0)#0631##06cc##0627##0644##060c##0627##0632##0627##06cc##0646# #067e##0633# #0628##0627##0023#780*#0634##0627##0631##0698##0628##062e##0631#</Message>
        </Language>
        <Language>
            <Id>3</Id>
            <Message></Message>
        </Language>
        <Language>
            <Id>4</Id>
            <Message></Message>
        </Language>
    </Tariff>
</Node>
<Node>Type22 Adv Notification
    <Tariff>
HLRDefinition
        <HLRAddress></HLRAddress>
        <StackType>1</StackType>
    </Tariff>
    <Tariff>
UssdTextMessage
        <Language>
            <Id>1</Id>
            <Message>#0647##0632##06cc##0646##0647#%evaluate($cost,0)#0631##06cc##0627##0644##060c##0634##0627##0631##0698# #0628##062e##0631##0628##0646##0632##0628##0628##0631# #0023#730*</Message>
        </Language>
        <Language>
            <Id>2</Id>
            <Message>#0647##0632##06cc##0646##0647#%evaluate($cost,0)#0631##06cc##0627##0644##060c##0634##0627##0631##0698# #0628##062e##0631##0628##0646##0632##0628##0628##0631# #0023#730*</Message>
        </Language>
        <Language>
            <Id>3</Id>
            <Message></Message>
        </Language>
        <Language>
            <Id>4</Id>
            <Message></Message>
        </Language>
    </Tariff>
</Node>
</Node>
</SDP>

我的代码是这样的(我确实是这样)

from lxml import etree
doc = etree.parse('test.xml')
for e in doc.iter():
    if e.tag == "StackType":
        if e.text == '1':
            path = doc.getpath(e)
            print(path)
            for path in doc.xpath(path):
                print(path.text)enter code here

我的输出是这样的:

/SDP/Node/Node[2]/Tariff[1]/StackType
1
/SDP/Node/Node[3]/Tariff[1]/StackType
1
/SDP/Node/Node[4]/Tariff[1]/StackType
1

但是我应该创建一个像这样的文件:

/ SDP(Ehsan)/ Node(通用定义)/ Node [1](Type19 Adv通知)/ Tarrif(HLRDefinition)/ StackType(0)

/ SDP(Ehsan)/ Node(通用定义)/ Node [2](Type20 Adv通知)/ Tarrif(HLRDefinition)/ StackType(1)

/ SDP(Ehsan)/ Node(通用定义)/ Node [3](Type21 Adv通知)/ Tarrif(HLRDefinition)/ StackType(1)

/ SDP(Ehsan)/ Node(通用定义)/ Node [4](Type22 Adv通知)/ Tarrif(HLRDefinition)/ StackType(1)

0 个答案:

没有答案