2012-02-25 42 views
5

Tôi phải phân tích cú pháp XML có tên thẻ có thể trong bất kỳ trường hợp nào (hỗn hợp, trên, dưới, vv) và tôi không biết trường hợp đó sẽ là gì trước. Làm thế nào tôi có thể làm cho findall hoàn toàn không phân biệt chữ hoa chữ thường trong ElementTree?Tìm kiếm phân biệt chữ hoa chữ thường trong Python ElementTree

# Does not work 
    variables = message.findall("VaRiAbLE") 
+3

vì 'XML' phân biệt chữ hoa chữ thường. – kev

+1

Tôi hiểu rằng XML phân biệt chữ hoa chữ thường. Tôi không kiểm soát việc tạo ra XML này để câu hỏi có nghĩa là ... Làm sao tìm kiếm một thẻ có thể xuất hiện trong mọi trường hợp? Boost iptree làm điều đó. Tôi cho rằng ElementTree cũng vậy. – 01100110

Trả lời

5

Bạn chỉ cần lấy chuỗi từ cây, viết hoa và làm lại cây. Sau đó, nó phải được phân tích cú pháp

import xml.etree.ElementTree as ET 
def to_parseable(tree): 
    t = ET.tostring(tree) 
    t = t.lower() 
    return ET.fromstring(t) 
+1

Cảm ơn bạn. Trong số tất cả các giải pháp tôi đã thử, cách tiếp cận này hoạt động tốt nhất. Tôi đồng ý rằng tôi không cần phải làm điều này vì người tạo XML nên sử dụng trường hợp nhất quán trong tên thẻ và thuộc tính, nhưng khi nó nằm ngoài tầm kiểm soát của bạn và bạn phải đối phó với loại XML này, thì cách tiếp cận này trong ElementTree hoạt động . – 01100110

+2

Wtf, tại sao bạn làm điều này? Ít nhất sử dụng regex để làm điều này chỉ áp dụng cho các thẻ và tên thuộc tính, jeez. – sleepycal

1

Regex để giải cứu. Lưu ý điều này có lẽ là khủng khiếp về mặt hiệu năng nhưng rất tuyệt vời khi trích xuất các thuộc tính XML từ các phần tử.

def getInsensitiveAttrbiute(element, key) : 

    keyRegex = re.compile(key, re.IGNORECASE) 
    for key in element.attrib.keys() : 
     if keyRegex.match(key) : 
      return element.attrib[key] 
    raise KeyError 


element = ET.fromstring('<FOO src="BAR" />') 
print getInsensitiveAttrbiute(element, "sRc") 
Các vấn đề liên quan