0 Câu hỏi: Làm thế nào để có được đường dẫn của tất cả các yếu tố với lxml với văn bản

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi có một tệp XML khổng lồ, tôi sẽ trích xuất hoàn toàn đường dẫn của các phần tử, với văn bản của chúng,

Tôi đã sử dụng gói lxml với getpath (), nhưng không thể đặt văn bản vào bên trong

mẫu Mã XML:

Tệp

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>

mã của tôi là như thế này (tôi đã làm như thế này)

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

đầu ra của tôi là như thế này:

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

nhưng tôi nên tạo một tệp như thế này:

/SDP (Ehsan) /Nút (Định nghĩa chung) /Nút [1] (Thông báo khuyến nghị loại 19) /Tarrif (HLRDefDef) /StackType (0)

/SDP (Ehsan) /Nút (Định nghĩa chung) /Nút [2] (Thông báo khuyến nghị loại 20) /Tarrif (HLRDefDef) /StackType (1)

/SDP (Ehsan) /Nút (Định nghĩa chung) /Nút [3] (Thông báo khuyến nghị loại 21) /Tarrif (HLRDefDef) /StackType (1)

/SDP (Ehsan) /Nút (Định nghĩa chung) /Nút [4] (Thông báo khuyến nghị loại 22) /Tarrif (HLRDefDef) /StackType (1)

    
- 1
0 Câu trả lời                              0                         
nguồn đặt đây