我有一個 XML 檔案,我需要從中回傳各種標簽的文本,包括公司名稱、名字、姓氏、內容、時間等。
到目前為止,我可以使用 for each 回圈來回傳其中一個標簽的每個迭代的文本,或者我可以回傳所有所需的資料,但必須是連續的塊。
我正在努力尋找答案的是,如何從指定的標簽中以正確的時間順序回傳它們在 XML 檔案中出現的適當文本。
下面我將介紹我已經嘗試過的內容。
首先,這里是我正在決議的 XML 內容:
<?xml version="1.0" encoding="UTF-8" standalone="no"? >
<FileDump>/span>
<Version>1.3</Version>/span>
<Conversation>/span>
<RoomID>1</RoomID>/span>
<StartTime>/span>09/2021 19:35:35</StartTime>/span>
<StartTimeUTC>/span>1631216135</StartTimeUTC>/span>
<ParticipantEntered>/span>
<User>/span>
<LoginName>JJohnson</LoginName>
<FirstName>/span>John</FirstName>
<LastName>Johnson</LastName>
<CompanyName>ABC LimitedCO</CompanyName>
<EmailAddress>[email protected]</EmailAddress>
<CorporateEmailAddress>none</CorporateEmailAddress>
<Content> Good Morning how are you today? </Content> 早上好,你今天怎么樣?
</User>/span>
<DateTime>/span>09/2021 19:35:35</DateTime>/span>
<DateTimeUTC>/span>1631216135</DateTimeUTC>/span>
<ConversationID></ConversationID>
</ParticipantEntered>>
<Message>/span>
<User>/span>
<LoginName>MMArks</LoginName>
<FirstName>/span>Mark</FirstName>
<LastName>/span>Marks</LastName>/span>
<CompanyName>XYZ Corp</CompanyName>
<EmailAddress>[email protected]</EmailAddress>
<CorporateEmailAddress></CorporateEmailAddress>
<Content>現在是什么時間?</Content>現在幾點了?
</User>/span>
</Message>/span>
</Conversation>/span>
</FileDump>/span>
以下代碼塊是我目前所嘗試的;
import xml.etree.ElementTree as ET
mytree = ET.parse(r's sample.xml')
myroot = mytree.getroot()
for content in myroot.iter('Content'):
for name in myroot.iter('CompanyName')。
cname = name
輸出=內容
print(name.text, output.text)
#此腳本將回傳:
XYZ公司早安
XYZ公司早上好,你今天怎么樣? XYZ公司現在是什么時候?
第一個應該說是ABC有限公司
#I then tried this:for content in myroot.findall('Conversation') 。
output = content.find('Content')
FName = content.find('FirstName')
LName = content.find('lastName')
cont = content.find('CompanyName')
print(cont, "
", FName, LName, output)
#這將回傳
無
無 無 無 無
所以它不會觸發一個錯誤,但是當我要求回傳文本時:
for content in myroot.findall('Conversation'/span>):
output = content.find('Content') .text
FName = content.find('FirstName').text
LName = content.find('LastName').text
cont = content.find('CompanyName').text
print(cont, "
", FName, LName, output)
#This returns an error "'NoneType' object has no attribute 'text'" - even though there clearly is text I don't understand why its failing
.#但奇怪的是,當我使用從ElementTree檔案中獲得的以下XML腳本時,上述代碼塊完全按照我的要求作業,我對其進行了編輯,添加了我在真實腳本中尋找的標簽,不作業的XML代碼已經被驗證為正確的XML,所以我已經排除了那里的任何錯誤 - 我對xml沒有足夠的了解,無法發現其中的差異并理解為什么不作業。
(當與最后一個代碼塊結合使用時,它可以發揮作用:
<?xml version="1.0"? >
<data>/span>
<country name="Liechtenstein">
<rank>1</rank>/span>
<年>2008</年>
<gdppc>/span>141100</gdppc>/span>
< 鄰居 名稱="奧地利" 方向="E"/>/span>
< 鄰居 名稱="Switzerland" 方向="W"/>
<FirstName>John</FirstName>/span>
<LastName>Johnson</LastName>
<CompanyName>ABC LIMITED</CompanyName>
<內容>/span>
早上好,你好嗎?
</Content>你好嗎?
</country>/span>
<country name="Singapore">/span>
<rank>4</rank>/span>
<年>2011</年>
<gdppc>59900</gdppc>
< 鄰居 名稱="馬來西亞" 方向="N"/>
<FirstName> Mark</FirstName>
<LastName>/span>Marks</LastName>/span>
<CompanyName>XYZ Corp</CompanyName>
<內容>/span>
早晨好
</Content>早安
</country>/span>
<country name="Panama"/span>>
<rank> 68</rank>
<年>2011</年>
<gdppc>/span>13600</gdppc>/span>
< 鄰居 名稱="哥斯達黎加" 方向="W"/>
< 鄰居 名稱="哥倫比亞" 方向="E"/gt;
<FirstName>/span>Keith</FirstName>/span>
<LastName>Keitherson</LastName>
<CompanyName>WC Corp</CompanyName>
<內容>
晚上好
</Content>晚安
</country>/span>
</data>
并且它回傳以下結果:
ABC有限公司
ABC有限公司 約翰-約翰遜 早上好,你好嗎?
XYZ公司
XYZ公司 馬克-馬克斯 早上好
WW公司 基思-凱斯森 晚上好
我試過的其他東西是:
for content in myroot.itertext()。
print(content)
#這確實回傳了檔案中所有可用的文本,但并沒有采取爭論的方式來縮小我對所需標簽的搜索范圍
。正如你可能知道的那樣,我是一個編碼新手,我正試圖通過這個方法來解決一個出現的問題。
我毫不懷疑我需要做的是一個非常簡單和基本的改變,但由于我缺乏知識,再加上網上有大量不同的方法,我把自己搞糊涂了,現在發現自己在這里。
我已經盡力提供盡可能多的資訊,所以任何知情者都應該能夠為我指出正確的方向。
如果還需要更多的資訊,請讓我知道
。編輯:
所需的輸出如下:
ABC有限公司
ABC有限公司 約翰-約翰遜 早上好,你今天好嗎?
XYZ公司 Mark Marks 現在是什么時候?
按照第一個建議,我現在使用的最新腳本是:
for content in myroot.findall('.//Conversation') 。
output = content.find(' .//Content').text
FName = content.find('./FirstName'/span>).text
LName = content.find('./LastName').text
cont = content.find('.//CompanyName').text
print(cont, "
", FName, LName, output)
這從指定的標簽中只回傳一個(第一個)結果,如:
。ABC LimitedCO 約翰-約翰遜,早上好,你今天好嗎?
編輯:
我收到的答案有好有壞,這個建議在這個XML塊上不能完美地作業:
我收到的答案有好有壞。
<?xml version="1.0" encoding="UTF-8"? >
<FileDump>/span>
<Version>1.3</Version>/span>
<Conversation>/span>
<RoomID>/span>CHAT</RoomID>
<StartTime>/span>09/2021 19:35:35</StartTime>/span>
<StartTimeUTC>/span>1631216135</StartTimeUTC>/span>
< ParticipantEntered InteractionType="N" DeviceType="M">
<User>/span>
<LoginName>JJohnson</LoginName>
<FirstName>JOHN</FirstName>
<LastName>Johnson</LastName>
<CompanyName>ABC Limited CO</CompanyName>
<EmailAddress>[email protected]</EmailAddress>
<CorporateEmailAddress></CorporateEmailAddress>
</User>/span>
<DateTime>/span>09/2021 19:35:35</DateTime>/span>
<DateTimeUTC>/span>1631216135</DateTimeUTC>/span>
<Content>/span>
測驗內容1
</Content>測驗內容1
<ConversationID>CHAT</ConversationID>
</ParticipantEntered>/span>
<Message>/span>
<User>/span>
<LoginName>MMarks</LoginName>
<FirstName>/span>Mark</FirstName>
<LastName>MArks</LastName>
<CompanyName>XYZ Corp</CompanyName>
<EmailAddress><EmailAddress>
<CorporateEmailAddress></CorporateEmailAddress>
</User>/span>
<DateTime>/span>09/2021 19:35:35</DateTime>/span>
<DateTimeUTC>/span>1631216135</DateTimeUTC>/span>
<Content>/span>
測驗內容2
</Content>測驗內容2
<ConversationID>CHAT</ConversationID>
</Message>/span>
<ParticipantEntered>/span>
<User>/span>
<LoginName>SSamson</LoginName>
<FirstName>/span>Sam</FirstName>
<LastName>Samson</LastName>
<CompanyName>123 CorpCO</CompanyName>
<EmailAddress></EmailAddress>
<CorporateEmailAddress></CorporateEmailAddress>
<內容>/span>
測驗內容3
</Content> 測驗內容3
</User>/span>
</ParticipantEntered>>
</Conversation>/span>
</FileDump>/span>
這就回傳:
ABC Limited CO Johnson JOHN not_found XYZ公司 MArks Mark 未找到 123公司CO Samson Sam 測驗內容3
uj5u.com熱心網友回復:
看起來下面的內容就是你要找的
import xml.etree.ElementTree as ET
xml = '''
<FileDump>/span>
<Version>1.3</Version>/span>
<Conversation>/span>
<RoomID>/span>CHAT</RoomID>
<StartTime>/span>09/2021 19:35:35</StartTime>/span>
<StartTimeUTC>/span>1631216135</StartTimeUTC>/span>
< ParticipantEntered InteractionType="N" DeviceType="M">
<User>/span>
<LoginName>JJohnson</LoginName>
<FirstName>JOHN</FirstName>
<LastName>Johnson</LastName>
<CompanyName>ABC Limited CO</CompanyName>
<EmailAddress>[email protected]</EmailAddress>
<CorporateEmailAddress />
</User>
<DateTime>/span>09/2021 19:35:35</DateTime>/span>
<DateTimeUTC>/span>1631216135</DateTimeUTC>/span>
<Content>測驗內容1</Content>/span>
<ConversationID>CHAT</ConversationID>
</ParticipantEntered>/span>
<Message>/span>
<User>/span>
<LoginName>MMarks</LoginName>
<FirstName>/span>Mark</FirstName>
<LastName>MArks</LastName>
<CompanyName>XYZ Corp</CompanyName>
<EmailAddress />>
<CorporateEmailAddress />>
</User>
<DateTime>/span>09/2021 19:35:35</DateTime>/span>
<DateTimeUTC>/span>1631216135</DateTimeUTC>/span>
<Content>測驗內容 2</Content>
<ConversationID>CHAT</ConversationID>
</Message>/span>
<ParticipantEntered>/span>
<User>/span>
<LoginName>SSamson</LoginName>
<FirstName>/span>Sam</FirstName>
<LastName>Samson</LastName>
<CompanyName>123 CorpCO</CompanyName>
<EmailAddress />>
<CorporateEmailAddress />>
<Content>測驗內容3</Content>
</User>/span>
</ParticipantEntered>>
</Conversation>/span>
</FileDump>/span>
'''
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公司MMarks Mark 測驗 content 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/324057.html
標籤:
