我有許多需要解析的XML文件.我寫了一些有用的代碼,但很難看,我想從比我更有經(jīng)驗(yàn)的人那里得到一些建議.
首先,我可能在錯(cuò)誤的上下文中使用了一些術(shù)語(yǔ),因?yàn)槲覍?duì)XML的經(jīng)驗(yàn)是有限的.按元素,除非另有說(shuō)明,我的意思是這樣的:
<root> <element> ... </element> <element> ... </element> </root>
無(wú)論如何,每個(gè)文件都包含許多元素,其中包含許多子元素(顯然).讓我感到困惑的是,需要以四種不同的方式獲取相關(guān)的價(jià)值觀;
1)節(jié)點(diǎn)文本:
<tag>value</tag>
2)屬性:
<tag attribute="value"></tag>
3)標(biāo)簽內(nèi)“隱藏”的值(在這種情況下為“true”):
<tag><boolean.true/></tag>
4)同名標(biāo)簽內(nèi)的值(“tagA”),但具有不同名稱的“祖父母”標(biāo)簽(“tag1”和“tag2”),都在同一元素內(nèi). “tagA”對(duì)我沒(méi)用,相反我會(huì)尋找“tag1”和“tag2”.
<element> <tag1><tagA>value</tagA><tag1> <tag2><tagA>value</tagA></tag2></element>
目前我有一個(gè)字典,每個(gè)文件都是一個(gè)關(guān)鍵字.值是帶有“屬性”,“節(jié)點(diǎn)文本”,“標(biāo)記”和“父元素”鍵的字典.
例:
{'file1.xml' : 'attributes' : {'Person': 'Id', 'Car' : 'Color'}, 'node text': ['Name', 'Address'],}
“Person”和“Car”是標(biāo)簽,“Id”和“Color”是屬性名稱.
這使得迭代所有元素并檢查每個(gè)標(biāo)記變得容易,如果字典中存在匹配(如果dict [‘file1.xml’] [‘a(chǎn)ttributes’]中的elem.tag),則提取值.
正如我所說(shuō),代碼有效,但我不喜歡我的解決方案.此外,并非所有元素都具有所有子元素(例如,Person可能沒(méi)有汽車,那么該標(biāo)簽將完全丟失),我需要將這些值分配給“None”.現(xiàn)在我得到每個(gè)文件中每個(gè)元素應(yīng)該存在的所有標(biāo)記,將它們變成一個(gè)集合,然后檢查它們與我實(shí)際從該元素中提取值的標(biāo)記集之間的差異.再一次,代碼非常難看.
希望這個(gè)爛攤子有道理.
編輯:
我使用了J.F.Sebastian建議將xpath存儲(chǔ)到字典中的每個(gè)值,字段名稱為鍵,xpath為值.
解決方法:
您可以使用相對(duì)于元素的xpath表達(dá)式而不是復(fù)雜的數(shù)據(jù)結(jié)構(gòu)來(lái)簡(jiǎn)化輸入代碼,例如,#1-4情況:
>標(biāo)簽/文字()
> tag / @ attribute
> name(DTBoolean / * [1])
>(tag1 | tag2)/ * / text()
要使用哪種輸出數(shù)據(jù)結(jié)構(gòu)取決于您希望以后如何在代碼中使用它.您可以從對(duì)當(dāng)前代碼最方便的結(jié)構(gòu)開始.當(dāng)您更好地理解要求時(shí),將其演變?yōu)楦ㄓ玫慕鉀Q方案.
I output it to csv, where each element is one row in the csv file.
…
I use a defaultdict to store the elements and then store those in a list before I output them to csv.
你可以使用普通的dict和csv.DictWriter(fieldnames = xpathdict.keys()):
# for each elementrow_dict = dict.fromkeys(xpathdict.keys())...# for each key row_dict[key] = element.xpath(xpathdict[key]) or None...dictwriter.writerow(row_dict)
其中xpathdict是字段名稱和相應(yīng)的xpath表達(dá)式之間的映射.一般來(lái)說(shuō),你可以存儲(chǔ)函數(shù)對(duì)象f(元素) – > csv字段而不是/除xpath exprs之外.
來(lái)源:https://www.icode9.com/content-1-413451.html聯(lián)系客服