2H / 220: Python - XML (elementtree) feldolgozás namespace-ek nélkül

+2 votes
asked Apr 12, 2014 in IRF tantárgy by marci32 (80 points)  

röviden: ennél nincs jobb megoldás?

Kb. 332 XML-t kell feldolgoznom, mindből szükségem van a DeviceID és a Name elemekre (2H / 220-as feladat), de nem akar összejönni a SOAP-os namespace-ek miatt. Egy XML-ből még megy (kb. úgy, ahogy itt a kérdésben), de ezt mindre nem írhatom, ha más a DeviceID előtti namespace szinte minden XML-ben. A stackoverflow-s megoldás is elég súlyosnak tűnik. Sikerült valakinek értelmesebben megoldani? Ha igen, hogyan?

1 Answer

+1 vote
answered Apr 12, 2014 by dzolnai (65 points)  
selected Apr 12, 2014 by marci32
 
Best answer

Szia,
telepítsd az lxml modult python-hoz, nekem így sikerült:

sudo zypper install python3-lxml

importáld be az lxml.elementtree-jét:

import lxml.etree as ET

Ha egy Elementet akarsz lekérdezni úgy, hogy tudod mi a namespace, pl.:

sok_valami = xml_root.findall("./{http://www.w3.org/2003/05/soap-envelope}Body/")

Ha úgy, hogy mindegy a namespace:

valami = xml_valami.find(".//{*}Name")
commented Apr 12, 2014 by marci32 (80 points)  
Szia!

Köszönöm, ez látszólag tényleg azt adja, amit szeretnék, és kellőképp rövid is!

Azért az érdekes, hogy valahol így néz ki a DeviceID:
\\?\Volume{2cb3b056-926b-11e3-824f-806e6f6e6963}\

máshol viszont korrekt:
PNP_BUS_0
commented Apr 13, 2014 by kolozsvari_anna (26 points)  
Nekem abban a pillanatban elszáll, amint a konkrét namespace-t *-ra cserélem. Mit csinálhatok rosszul?
commented Apr 13, 2014 by marci32 (80 points)  
Elementtree-t használva nekem is elszállt, ezért kell ez az lxml helyette.

Milyen hibát ír?
commented Apr 13, 2014 by kolozsvari_anna (26 points)  
Valóban, az importon csak átfutottam, így már jó:)
Abban még tudnál segíteni, hogy így a taget írja ki: [<Element {http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/Win32_USBController}Name at 0xb6ba5e8c>]

De hogy tudnám kiszedni ebből a konkrét értékét? Bármilyen függvénnyel próbálkozom rajta, csak azt mondja, hogy ez egy lista...
commented Apr 13, 2014 by marci32 (80 points)  
Hmm... pontosan mire kapod ezt a kimenetet? print(root.find(".//{*}Name")), ahol root egy xml gyökéreleme?
commented Apr 13, 2014 by kolozsvari_anna (26 points)  
Valamilyen indíttatásból findall()-t használtam, ami valóban egy lista, közben sikerült rájönnöm, hogy egyes elemeire gyönyörűen megy a .text
Köszi szépen!:)
...