我有一个巨大的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)