首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 使用 xml.dom.minidom 任意節點 XPath 風格存取

     編輯:更多程式設計知識

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)屬性過濾

限制與擴展

  • 不支援完整 XPath (祖先、後代、軸向)。
  • 大型 XML 建議使用 lxml.etree 支援真正 XPath。
  • 可擴充 __getattr__ 回傳列表支援多節點匹配。

此封裝適合中小型 XML 設定檔快速解析,程式碼極度簡潔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved