我有一个XML文件,我需要从不同的标签,CompanyName,FirstName,LastName,内容,时间等返回文本。
到目前为止,我可以使用for each循环返回其中一个标记的每次迭代的文本,也可以在连续块中返回所有必需的数据。
我正在努力寻找的答案是,如何按照XML文档中出现的正确时间顺序从指定的标记中返回适当的文本。
下面我将描述我已经尝试过的内容。
首先,下面是我正在解析的XML内容:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<FileDump>
<Version>1.3</Version>
<Conversation>
<RoomID>1</RoomID>
<StartTime>09/09/2021 19:35:35</StartTime>
<StartTimeUTC>1631216135</StartTimeUTC>
<ParticipantEntered>
<User>
<LoginName>JJohnson</LoginName>
<FirstName>John</FirstName>
<LastName>Johnson</LastName>
<CompanyName>ABC LimitedCO</CompanyName>
<EmailAddress>JJ@ABC.com</EmailAddress>
<CorporateEmailAddress>none</CorporateEmailAddress>
<Content> good Morning how are you today? </Content>
</User>
<DateTime>09/09/2021 19:35:35</DateTime>
<DateTimeUTC>1631216135</DateTimeUTC>
<ConversationID></ConversationID>
</ParticipantEntered>
<Message>
<User>
<LoginName>MMArks</LoginName>
<FirstName>Mark</FirstName>
<LastName>Marks</LastName>
<CompanyName>XYZ Corp</CompanyName>
<EmailAddress>mm@xyz.com</EmailAddress>
<CorporateEmailAddress></CorporateEmailAddress>
<Content> what time is it? </Content>
</User>
</Message>
</Conversation>
</FileDump>下面的代码块是我到目前为止已经尝试过的;
import xml.etree.ElementTree as ET
mytree = ET.parse(r'sample.xml')
myroot = mytree.getroot()
for content in myroot.iter('Content'):
for name in myroot.iter('CompanyName'):
cname = name
output = content
print(name.text, output.text)#此脚本将返回:
XYZ公司早上好,你今天好吗?XYZ公司现在几点了?
第一个应该是ABC有限公司
#然后我尝试了一下:
for content in myroot.findall('Conversation'):
output = content.find('Content')
FName = content.find('FirstName')
LName = content.find('LastName')
cont = content.find('CompanyName')
print(cont, "\n", FName, LName, output)#这返回
无无无
所以它不会触发错误,但是当我请求返回以下内容的文本时:
for content in myroot.findall('Conversation'):
output = content.find('Content').text
FName = content.find('FirstName').text
LName = content.find('LastName').text
cont = content.find('CompanyName').text
print(cont, "\n", FName, LName, output)#这会返回一个错误"'NoneType‘对象没有属性' text '“--即使有明显的文本,我也不明白它为什么会失败
#但奇怪的是,当我使用从ElementTree文档中获得的以下XML脚本时,上面的代码块完全按照我想要的那样工作,我已经编辑了它,以添加我在真实脚本中寻找的标记,不能工作的XML代码已经被验证为正确的XML,所以我已经排除了那里的任何错误-我对xml的了解不够,无法找出区别和理解为什么它不能工作:
(当与最后一段代码结合使用时,这是可行的:
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
<FirstName>John</FirstName>
<LastName>Johnson</LastName>
<CompanyName>ABC LIMITED</CompanyName>
<Content>
Good Morning How are you?
</Content>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
<FirstName>Mark</FirstName>
<LastName>Marks</LastName>
<CompanyName>XYZ Corp</CompanyName>
<Content>
Good Morning
</Content>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
<FirstName>Keith</FirstName>
<LastName>Keitherson</LastName>
<CompanyName>WW Corp</CompanyName>
<Content>
Good Evening
</Content>
</country>
</data>并返回以下结果:
ABC有限公司约翰·约翰逊早上好,您好吗?
XYZ公司马克表示早上好
WW公司Keith Keitherson晚上好
我尝试过的其他方法有:
for content in myroot.itertext():
print(content)#这确实返回了文档中的所有可用文本,但不需要争论来缩小我对所需标签的搜索范围
正如你可能会说的那样,我是一个编程新手,我试图用我的方式来解决已经出现的问题。
我毫不怀疑,这是我需要做的一个非常简单和基本的改变,但由于我缺乏知识,加上网上有大量不同的方法可以做到这一点,我对自己感到困惑,现在发现自己在这里。
我已经尝试给出尽可能多的信息,所以任何知情的人都应该能够给我指出正确的方向。
如果需要更多信息,请让我知道
编辑:
期望的输出如下:
ABC有限公司约翰·约翰逊早上好,你今天好吗?
XYZ公司Mark Marks现在几点了?
根据第一个建议,我现在使用的最新脚本是:
for content in myroot.findall('.//Conversation'):
output = content.find('.//Content').text
FName = content.find('.//FirstName').text
LName = content.find('.//LastName').text
cont = content.find('.//CompanyName').text
print(cont, "\n", FName, LName, output)这只返回指定标记中的一个(第一个)结果:
美国广播公司LimitedCO约翰·约翰逊早上好,您今天好吗?
编辑:
我收到的答案好坏参半,这个建议在这段XML上不能完美地工作:
<?xml version="1.0" encoding="UTF-8"?>
<FileDump>
<Version>1.3</Version>
<Conversation>
<RoomID>CHAT</RoomID>
<StartTime>09/09/2021 19:35:35</StartTime>
<StartTimeUTC>1631216135</StartTimeUTC>
<ParticipantEntered InteractionType="N" DeviceType="M">
<User>
<LoginName>JJohnson</LoginName>
<FirstName>JOHN</FirstName>
<LastName>Johnson</LastName>
<CompanyName>ABC Limited CO</CompanyName>
<EmailAddress>JJ@abc.com</EmailAddress>
<CorporateEmailAddress></CorporateEmailAddress>
</User>
<DateTime>09/09/2021 19:35:35</DateTime>
<DateTimeUTC>1631216135</DateTimeUTC>
<Content>
Testing Content 1
</Content>
<ConversationID>CHAT</ConversationID>
</ParticipantEntered>
<Message>
<User>
<LoginName>MMarks</LoginName>
<FirstName>Mark</FirstName>
<LastName>MArks</LastName>
<CompanyName>XYZ Corp</CompanyName>
<EmailAddress></EmailAddress>
<CorporateEmailAddress></CorporateEmailAddress>
</User>
<DateTime>09/09/2021 19:35:35</DateTime>
<DateTimeUTC>1631216135</DateTimeUTC>
<Content>
Testing content 2
</Content>
<ConversationID>CHAT</ConversationID>
</Message>
<ParticipantEntered>
<User>
<LoginName>SSamson</LoginName>
<FirstName>Sam</FirstName>
<LastName>Samson</LastName>
<CompanyName>123 CorpCO</CompanyName>
<EmailAddress></EmailAddress>
<CorporateEmailAddress></CorporateEmailAddress>
<Content>
Testing content 3
</Content>
</User>
</ParticipantEntered>
</Conversation>
</FileDump>这将返回:
美国广播公司有限公司强生公司约翰not_found XYZ公司MArks Mark not_found 123 CorpCO Samson Sam测试内容3
发布于 2021-09-16 13:08:27
看起来下面就是你要找的东西
import xml.etree.ElementTree as ET
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<FileDump>
<Version>1.3</Version>
<Conversation>
<RoomID>CHAT</RoomID>
<StartTime>09/09/2021 19:35:35</StartTime>
<StartTimeUTC>1631216135</StartTimeUTC>
<ParticipantEntered InteractionType="N" DeviceType="M">
<User>
<LoginName>JJohnson</LoginName>
<FirstName>JOHN</FirstName>
<LastName>Johnson</LastName>
<CompanyName>ABC Limited CO</CompanyName>
<EmailAddress>JJ@abc.com</EmailAddress>
<CorporateEmailAddress />
</User>
<DateTime>09/09/2021 19:35:35</DateTime>
<DateTimeUTC>1631216135</DateTimeUTC>
<Content>Testing Content 1</Content>
<ConversationID>CHAT</ConversationID>
</ParticipantEntered>
<Message>
<User>
<LoginName>MMarks</LoginName>
<FirstName>Mark</FirstName>
<LastName>MArks</LastName>
<CompanyName>XYZ Corp</CompanyName>
<EmailAddress />
<CorporateEmailAddress />
</User>
<DateTime>09/09/2021 19:35:35</DateTime>
<DateTimeUTC>1631216135</DateTimeUTC>
<Content>Testing content 2</Content>
<ConversationID>CHAT</ConversationID>
</Message>
<ParticipantEntered>
<User>
<LoginName>SSamson</LoginName>
<FirstName>Sam</FirstName>
<LastName>Samson</LastName>
<CompanyName>123 CorpCO</CompanyName>
<EmailAddress />
<CorporateEmailAddress />
<Content>Testing content 3</Content>
</User>
</ParticipantEntered>
</Conversation>
</FileDump>
'''
NOT_FOUND = '__NOT_FOUND__'
def _get(ele, name):
sub = ele.find(name)
return sub.text if sub is not None else NOT_FOUND
root = ET.fromstring(xml)
elements = ['CompanyName', 'LoginName', 'FirstName', 'Content']
def loop(base_ele):
for pe in root.findall(f'.//{base_ele}'):
content = _get(pe, 'Content')
u = pe.find('User')
data = [_get(u, x) for x in elements] if content == NOT_FOUND else [_get(u, x) for x in elements[:-1]]
if len(data) < 4:
data.append(content)
msg = ' '.join(data)
print(f"{msg}")
loop('ParticipantEntered')
loop('Message')输出
ABC Limited CO JJohnson JOHN Testing Content 1
123 CorpCO SSamson Sam Testing content 3
XYZ Corp MMarks Mark Testing content 2https://stackoverflow.com/questions/69206889
复制相似问题