我正在嘗試將以下 xml 資料轉換為資料框。
<?xml version="1.0" encoding="utf-8"?>
<TEST>
<Node1L1>1</Node1L1>
<Node2L1>FP</Node2L1>
<SUBL1>
<M>
<PAR>
<NAME>A</NAME>
<TYPE>f</TYPE>
<DESC />
<VAL>1,2,3,4,5,6</VAL>
</PAR>
<PAR>
<NAME>B</NAME>
<TYPE>f</TYPE>
<DESC />
<VAL>10,20,30,40,50,60</VAL>
</PAR>
<PAR>
<NAME>C</NAME>
<TYPE>f</TYPE>
<DESC />
<VAL>11,22,33,44,55,66</VAL>
</PAR>
<PAR>
<NAME>D</NAME>
<TYPE>f</TYPE>
<DESC />
<VAL>a,b,c,d,e,f</VAL>
</PAR>
<PAR>
<NAME>E</NAME>
<TYPE>f</TYPE>
<DESC />
<VAL>aa,bb,cc,dd,ee,ff</VAL>
</PAR>
</M>
<M>
<PAR>
<NAME>A_test</NAME>
<VAL>0.0,0.1,0.2,0.3,0.4,0.5</VAL>
</PAR>
</M>
</SUBL1>
</TEST>
我只需要提取名稱A、C、E的第一個M標記PAR子節點
這只是一個示例檔案,但我擁有的檔案很大,在 2 M標簽中有很多PAR標簽。我能夠使用下面的代碼進行 XML 轉換,但它也需要第二個M標簽PAR標簽。
df = pd.read_xml(path2file, xpath="//*[local-name()='PAR']")
我正在嘗試找到一種改進xpath=字串的方法,以便它僅將前M 個標記資料提取到資料幀中。另外,如果有任何替代方法,請告訴我。我還想避免節點中的空DESC列。
uj5u.com熱心網友回復:
見下文
import xml.etree.ElementTree as ET
import pandas as pd
xml = '''<?xml version="1.0" encoding="utf-8"?>
<TEST>
<Node1L1>1</Node1L1>
<Node2L1>FP</Node2L1>
<SUBL1>
<M>
<PAR>
<NAME>A</NAME>
<TYPE>f</TYPE>
<DESC />
<VAL>1,2,3,4,5,6</VAL>
</PAR>
<PAR>
<NAME>B</NAME>
<TYPE>f</TYPE>
<DESC />
<VAL>10,20,30,40,50,60</VAL>
</PAR>
<PAR>
<NAME>C</NAME>
<TYPE>f</TYPE>
<DESC />
<VAL>11,22,33,44,55,66</VAL>
</PAR>
<PAR>
<NAME>D</NAME>
<TYPE>f</TYPE>
<DESC />
<VAL>a,b,c,d,e,f</VAL>
</PAR>
<PAR>
<NAME>E</NAME>
<TYPE>f</TYPE>
<DESC />
<VAL>aa,bb,cc,dd,ee,ff</VAL>
</PAR>
</M>
<M>
<PAR>
<NAME>A_test</NAME>
<VAL>0.0,0.1,0.2,0.3,0.4,0.5</VAL>
</PAR>
</M>
</SUBL1>
</TEST>'''
root = ET.fromstring(xml)
pars = list(root.find('.//M'))
data = [[p.text for p in list(par) if p.text] for par in pars if par.find('NAME').text in ['A','C','E']]
df = pd.DataFrame(data,columns = ['NAME','TYPE','VAL'])
print(df)
輸出
NAME TYPE VAL
0 A f 1,2,3,4,5,6
1 C f 11,22,33,44,55,66
2 E f aa,bb,cc,dd,ee,ff
uj5u.com熱心網友回復:
從pandas.read_xml()您的檔案中可以看到它lxml被用作默認決議器。
不幸的是,(以及內置的)不支持XPath 2.0,因此通用解決方案不適合。但是我們可以使用XPath 1.0替代方案 — .lxml xml.etree.ElementTree.//M[1]/PAR[NAME=('A','C','E')].//M[1]/PAR[NAME='A' or NAME='C' or NAME='E']
最終代碼將是下一個:
df = pd.read_xml(
path2file,
xpath=".//M[1]/PAR[NAME='A' or NAME='C' or NAME='E']"
)
PS 還沒有測驗過,所以如果由于某種原因它不起作用,請告訴我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341389.html
下一篇:使用屬性值和子元素解組xml屬性
