gpt4 book ai didi

python - LXML Xpath 似乎没有返回完整路径

转载 作者:行者123 更新时间:2023-11-28 22:54:49 26 4
gpt4 key购买 nike

好吧,我会第一个承认它是,只是不是我想要的路径,我不知道如何得到它。

我在工作的 Windows 7 和家里的 ubuntu 13.04 中都在 Eclipse 中使用 Python 3.3 和 Pydev 插件。我是 python 新手,编程经验有限。

我正在尝试编写一个脚本来接收 XML Lloyds 市场保险消息,找到所有标签并将它们转储到 .csv 中,我们可以在其中轻松更新它们,然后重新导入它们以创建更新的 xml。

我已经设法做到了所有这些,除了当我获得所有标签时它只给出标签名称而不是上面的标签。

<TechAccount Sender="broker" Receiver="insurer">
<UUId>2EF40080-F618-4FF7-833C-A34EA6A57B73</UUId>
<BrokerReference>HOY123/456</BrokerReference>
<ServiceProviderReference>2012080921401A1</ServiceProviderReference>
<CreationDate>2012-08-10</CreationDate>
<AccountTransactionType>premium</AccountTransactionType>
<GroupReference>2012080921401A1</GroupReference>
<ItemsInGroupTotal>
<Count>1</Count>
</ItemsInGroupTotal>
<ServiceProviderGroupReference>8-2012-08-10</ServiceProviderGroupReference>
<ServiceProviderGroupItemsTotal>
<Count>13</Count>
</ServiceProviderGroupItemsTotal>

那是 XML 的片段。我想要的是找到所有标签及其路径。例如,我想将其显示为 ItemsInGroupTotal/Count,但只能将其显示为 Count。

这是我的代码:

xml = etree.parse(fullpath)
print( xml.xpath('.//*'))
all_xpath = xml.xpath('.//*')
every_tag = []
for i in all_xpath:
single_tag = '%s,%s' % (i.tag, i.text)
every_tag.append(single_tag)
print(every_tag)

这给出:

'{http://www.ACORD.org/standards/Jv-Ins-Reinsurance/1}ServiceProviderGroupReference,8-2012-08-10', '{http://www.ACORD.org/standards/Jv-Ins-Reinsurance/1}ServiceProviderGroupItemsTotal,\n', '{http://www.ACORD.org/standards/Jv-Ins-Reinsurance/1}Count,13',

如您所见,Count 显示为 {namespace}Count, 13 而不是 {namespace}ItemsInGroupTotal/Count, 13

谁能指出我需要什么?

谢谢(希望我的第一篇文章没问题)

亚当

编辑:

现在这是我的代码: 使用 open(fullpath, 'rb') 作为 xmlFilepath: xmlfile = xmlFilepath.read()

fulltext = '%s' % xmlfile
text = fulltext[2:]
print(text)


xml = etree.fromstring(fulltext)
tree = etree.ElementTree(xml)

every_tag = ['%s, %s' % (tree.getpath(e), e.text) for e in xml.iter()]
print(every_tag)

但这会返回一个错误:ValueError:不支持带有编码声明的 Unicode 字符串。请使用不带声明的字节输入或 XML 片段。

我删除了前两个字符,因为你是 b' 并且它提示它没有以标签开头

更新:

我一直在研究这个,如果我删除 xis:xxx 标签和顶部的 namespace 内容,它会按预期工作。我需要保留 xis 标签并能够将它们识别为 xis 标签,所以不能只删除它们。

对我如何实现这一点有什么帮助吗?

最佳答案

ElementTree objects have a method getpath(element), which returns a structural, absolute XPath expression to find that element

iter() 循环中的每个元素上调用 getpath 应该适合你:

from pprint import pprint
from lxml import etree


text = """
<TechAccount Sender="broker" Receiver="insurer">
<UUId>2EF40080-F618-4FF7-833C-A34EA6A57B73</UUId>
<BrokerReference>HOY123/456</BrokerReference>
<ServiceProviderReference>2012080921401A1</ServiceProviderReference>
<CreationDate>2012-08-10</CreationDate>
<AccountTransactionType>premium</AccountTransactionType>
<GroupReference>2012080921401A1</GroupReference>
<ItemsInGroupTotal>
<Count>1</Count>
</ItemsInGroupTotal>
<ServiceProviderGroupReference>8-2012-08-10</ServiceProviderGroupReference>
<ServiceProviderGroupItemsTotal>
<Count>13</Count>
</ServiceProviderGroupItemsTotal>
</TechAccount>
"""

xml = etree.fromstring(text)
tree = etree.ElementTree(xml)

every_tag = ['%s, %s' % (tree.getpath(e), e.text) for e in xml.iter()]
pprint(every_tag)

打印:

['/TechAccount, \n',
'/TechAccount/UUId, 2EF40080-F618-4FF7-833C-A34EA6A57B73',
'/TechAccount/BrokerReference, HOY123/456',
'/TechAccount/ServiceProviderReference, 2012080921401A1',
'/TechAccount/CreationDate, 2012-08-10',
'/TechAccount/AccountTransactionType, premium',
'/TechAccount/GroupReference, 2012080921401A1',
'/TechAccount/ItemsInGroupTotal, \n',
'/TechAccount/ItemsInGroupTotal/Count, 1',
'/TechAccount/ServiceProviderGroupReference, 8-2012-08-10',
'/TechAccount/ServiceProviderGroupItemsTotal, \n',
'/TechAccount/ServiceProviderGroupItemsTotal/Count, 13']

更新:如果您的 xml 数据在文件 test.xml 中,则代码如下所示:

from pprint import pprint
from lxml import etree

xml = etree.parse('test.xml').getroot()
tree = etree.ElementTree(xml)

every_tag = ['%s, %s' % (tree.getpath(e), e.text) for e in xml.iter()]
pprint(every_tag)

希望对您有所帮助。

关于python - LXML Xpath 似乎没有返回完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17558532/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com