如何解决如何使用命名空间从 XML 中提取嵌套值?
<?xml version="1.0" encoding="utf-8"?>
<go-home-1:GOHOMEV1 xmlns:go-home-1="https://sample.com/GO-HOME-V1">
<HOMEV1FileHeader>
<FileCreationTimestamp>2020-02-15T08:29:22+01:00</FileCreationTimestamp>
<FileType>AB716</FileType>
<SGO>YIFG</SGO>
</HOMEV1FileHeader>
<OI>
<ON>YIFG4</ON>
<CI>HYU</CI>
<NL>
<NT>
<GOCode>HYU34</GOCode>
<NTName>HYUFFT - 11</NTName>
<NTData>
<RIS>
<RI>
<EDC>2020-01-18</EDC>
<E4NS>
<GNS>
<RD>
<NR>
<CC>9012</CC>
<NDC>411</NDC>
<SRng>
<SRngStart>000</SRngStart>
<SRngStop>999</SRngStop>
</SRng>
</NR>
</RD>
<RD>
<NR>
<CC>834</CC>
<NDC>101</NDC>
<SRng>
<SRngStart>150</SRngStart>
<SRngStop>295</SRngStop>
</SRng>
</NR>
</RD>
</GNS>
</E4NS>
<E2NS>
<MCC>111</MCC>
<MNC>222</MNC>
</E2NS>
<E2G>
<MGT_CC>9012</MGT_CC>
<MGT_NC>4113</MGT_NC>
</E2G>
</RI>
</RIS>
</NTData>
</NT>
</NL>
</OI>
</go-home-1:GOHOMEV1>
我的尝试如下(从这里获取想法Getting all children of a node using xml.etree.ElementTree)
但是我遇到了一些错误或空列表(对于 sgo = root.find()...
和 A = root.findall()...
),我被卡住了。感谢您的帮助。
import xml.etree.ElementTree as ET
import glob,os
filename = "file.xml"
namespaces = {
"go-home-1": "https://sample.com/GO-HOME-V1"
}
root = ET.parse(filename).getroot()
# For this sgo = root.find()... I get ERROR << AttributeError: 'nonetype' object has no attribute 'text'>>
sgo = root.find("go-home-1:HOMEV1FileHeader/"
"go-home-1:SGO",namespaces).text
### For below I'm getting empty list A = [] and I don't kNow why.
A = root.findall(
"go-home-1:OI/go-home-1:NL/go-home-1:NT[1]/go-home-1:NTData/go-home-1:RIS/go-home-1:RI/go-home-1:E4NS/"
"go-home-1:GNS/"
"go-home-1:RD/"
"go-home-1:NR",namespaces)
for item1 in A:
Result = [sgo]
cc = item1.find("go-home-1:CC",namespaces).text
ndc = item1.find("go-home-1:NDC",namespaces).text
Result.append(cc)
Result.append(ndc)
B = item1.findall(
"go-home-1:OI/go-home-1:NL/go-home-1:NT[1]/go-home-1:NTData/go-home-1:RIS/go-home-1:RI/go-home-1:E4NS/"
"go-home-1:GNS/"
"go-home-1:RD/"
"go-home-1:NR/"
"go-home-1:SRng",namespaces)
for item2 in B:
RngStart = item2.find("go-home-1:SRngStart",namespaces).text
RngStop = item2.find("go-home-1:SRngStop",namespaces).text
Result.append(RngStart)
Result.append(RngStop)
print(Result)
解决方法
在这个特定的 xml 中,考虑到预期的输出,命名空间并不是真正必要的。此外,我认为展示输出的最佳方式是使用数据框。
var respone = await httpClient.PostAsXmlAsync<WorkItem>(requestUri,workItem);
输出:
import pandas as pd
columns = ['SGO','MCC','MNC','MGT_CC','MGT_NC','CC','NDC','SRngStart','SRngStop']
sgo = root.find('.//SGO').text
mcc = root.find('.//MCC').text
mnc = root.find('.//MNC').text
mgt_cc = root.find('.//MGT_CC').text
mgt_nc = root.find('.//MGT_NC').text
rows = []
for entry in root.findall('.//RD'):
row = []
cc = entry.find('.//CC').text
ndc = entry.find('.//NDC').text
srngstart = entry.find('.//SRngStart').text
srngstop = entry.find('.//SRngStop').text
row.extend([sgo,mcc,mnc,mgt_cc,mgt_nc,cc,ndc,srngstart,srngstop])
rows.append(row)
df = pd.DataFrame(rows,columns=columns)
df
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。