xml.dom.minidom 原生 API 冗長。本文封裝 SimpleXmlGetter 類別,支援屬性存取 (.node)、索引 ([i])、條件查詢 ((attr=value)) 三種語法,實現類 XPath 的便利存取。
import xml.dom.minidom
ELEMENT_NODE = xml.dom.Node.ELEMENT_NODE
class SimpleXmlGetter:
def __init__(self, data):
if isinstance(data, str):
self.root = xml.dom.minidom.parse(data)
else:
self.root = data
def __getattr__(self, name):
if name == 'data':
return self.root.firstChild.data
for c in self.root.childNodes:
if c.nodeType == ELEMENT_NODE and c.tagName == name:
return SimpleXmlGetter(c)
raise AttributeError(name)
def __getitem__(self, index):
siblings = [e for e in self.root.parentNode.childNodes
if e.nodeType == ELEMENT_NODE and e.tagName == self.root.tagName]
return SimpleXmlGetter(siblings[index])
def __call__(self, **kwargs):
for e in self.root.parentNode.childNodes:
if e.nodeType == ELEMENT_NODE:
for k, v in kwargs.items():
if e.getAttribute(k) != v:
break
else:
return SimpleXmlGetter(e)
raise KeyError(kwargs)
XML (sysd.xml):
30
60
程式碼:
x = SimpleXmlGetter("sysd.xml")
print(x.sysd.sysagent.param[1].data) # 索引: 60
print(x.sysd.sysagent.param(name="querytimeout", type="second").data) # 條件: 60
| 語法 | 對應操作 |
|---|---|
.tag | 子節點 |
[i] | 同名同級第 i 個 |
.data | 文字內容 |
(attr=val) | 屬性過濾 |
lxml.etree 支援真正 XPath。__getattr__ 回傳列表支援多節點匹配。此封裝適合中小型 XML 設定檔快速解析,程式碼極度簡潔。