Hướng dẫn python xml get parent - python xml nhận cha mẹ

Tôi đang sử dụng mô -đun Python ElementTree tích hợp. Việc tiếp cận trẻ em là đơn giản, nhưng còn các nút cha mẹ hoặc anh chị em thì sao? - Điều này có thể được thực hiện một cách hiệu quả mà không đi qua toàn bộ cây?

hỏi ngày 31 tháng 1 năm 2010 lúc 5:02Jan 31, 2010 at 5:02

Hướng dẫn python xml get parent - python xml nhận cha mẹ

Hojuhojuhoju

27.4K37 Huy hiệu vàng133 Huy hiệu bạc174 Huy hiệu đồng37 gold badges133 silver badges174 bronze badges

1

Không có hỗ trợ trực tiếp dưới dạng thuộc tính

parent_map = {c:p for p in tree.iter() for c in p}
3, nhưng có lẽ bạn có thể sử dụng các mẫu được mô tả ở đây để đạt được hiệu ứng mong muốn. Một liner sau đây được đề xuất (được cập nhật từ bài liên kết đến bài đăng lên Python 3.8) để tạo ánh xạ từ trẻ em đến cha mẹ cho toàn bộ cây, sử dụng phương pháp
parent_map = {c:p for p in tree.iter() for c in p}
4:

parent_map = {c: p for p in tree.iter() for c in p}

0 _

9.72110 Huy hiệu vàng73 Huy hiệu bạc106 Huy hiệu Đồng10 gold badges73 silver badges106 bronze badges

Đã trả lời ngày 31 tháng 1 năm 2010 lúc 8:04Jan 31, 2010 at 8:04

Vinay Sajipvinay SajipVinay Sajip

92.7K14 Huy hiệu vàng174 Huy hiệu bạc184 Huy hiệu đồng14 gold badges174 silver badges184 bronze badges

3

Câu trả lời của Vinay vẫn nên hoạt động, nhưng đối với Python 2.7+ và 3.2+, những điều sau đây được khuyến nghị:

parent_map = {c:p for p in tree.iter() for c in p}

parent_map = {c:p for p in tree.iter() for c in p}
5 không được ủng hộ có lợi cho
parent_map = {c:p for p in tree.iter() for c in p}
6 và thật tuyệt khi sử dụng hàm tạo hiểu danh sách
parent_map = {c:p for p in tree.iter() for c in p}
7 mới.

Thứ hai, trong khi xây dựng một tài liệu XML, có thể một đứa trẻ sẽ có nhiều cha mẹ, mặc dù điều này sẽ bị xóa khi bạn tuần tự hóa tài liệu. Nếu điều đó quan trọng, bạn có thể thử điều này:

parent_map = {}
for p in tree.iter():
    for c in p:
        if c in parent_map:
            parent_map[c].append(p)
            # Or raise, if you don't want to allow this.
        else:
            parent_map[c] = [p]
            # Or parent_map[c] = p if you don't want to allow this

Đã trả lời ngày 21 tháng 11 năm 2013 lúc 21:31Nov 21, 2013 at 21:31

Supergrasupergrasupergra

1.50813 huy hiệu bạc19 Huy hiệu đồng13 silver badges19 bronze badges

3

Bạn có thể sử dụng ký hiệu XPath

parent_map = {c:p for p in tree.iter() for c in p}
8 trong ElementTree.

<parent>
     <child id="123">data1</child>
</parent>

xml.findall('.//child[@id="123"]...')
>> [<Element 'parent'>]

Đã trả lời ngày 22 tháng 10 năm 2015 lúc 12:18Oct 22, 2015 at 12:18

Josvenjosvenjosven

3593 Huy hiệu bạc7 Huy hiệu Đồng3 silver badges7 bronze badges

7

Như đã đề cập trong phần tử cha mẹ sau khi sử dụng phương thức tìm (xml.etree.elementtree), bạn sẽ phải thực hiện tìm kiếm gián tiếp cho cha mẹ. Có XML:

<a>
 <b>
  <c>data</c>
  <d>data</d>    
 </b>
</a>

Giả sử bạn đã tạo phần tử Etree thành biến

parent_map = {c:p for p in tree.iter() for c in p}
9, bạn có thể sử dụng:

 In[1] parent = xml.find('.//c/..')
 In[2] child = parent.find('./c')

Kết quả là:

Out[1]: <Element 'b' at 0x00XXXXXX> 
Out[2]: <Element 'c' at 0x00XXXXXX>

Cha mẹ cao hơn sẽ được tìm thấy như: ________ 20 là

parent_map = {}
for p in tree.iter():
    for c in p:
        if c in parent_map:
            parent_map[c].append(p)
            # Or raise, if you don't want to allow this.
        else:
            parent_map[c] = [p]
            # Or parent_map[c] = p if you don't want to allow this
1

Đã trả lời ngày 24 tháng 11 năm 2015 lúc 22:19Nov 24, 2015 at 22:19

VaashavaashaVaasha

8411 Huy hiệu vàng10 Huy hiệu bạc19 Huy hiệu đồng1 gold badge10 silver badges19 bronze badges

1

Dán ở đây câu trả lời của tôi từ https://stackoverflow.com/a/54943960/492336:

Tôi đã có một vấn đề tương tự và tôi có một chút sáng tạo. Hóa ra không có gì ngăn cản chúng ta tự thêm thông tin cha mẹ. Sau này chúng ta có thể tước nó một khi chúng ta không còn cần nó nữa.

def addParentInfo(et):
    for child in et:
        child.attrib['__my_parent__'] = et
        addParentInfo(child)

def stripParentInfo(et):
    for child in et:
        child.attrib.pop('__my_parent__', 'None')
        stripParentInfo(child)

def getParent(et):
    if '__my_parent__' in et.attrib:
        return et.attrib['__my_parent__']
    else:
        return None

# Example usage

tree = ...
addParentInfo(tree.getroot())
el = tree.findall(...)[0]
parent = getParent(el)
while parent:
    doSomethingWith(parent)
    parent = getParent(parent)
stripParentInfo(tree.getroot())

Đã trả lời ngày 1 tháng 3 năm 2019 lúc 11:46Mar 1, 2019 at 11:46

Sashoalmsashoalmsashoalm

71.7K112 Huy hiệu vàng412 Huy hiệu bạc752 Huy hiệu đồng112 gold badges412 silver badges752 bronze badges

Bộ chọn XPath '..' không thể được sử dụng để truy xuất nút mẹ theo 3.5.3 hay 3.6.1 (ít nhất là trên OSX), ví dụ: ở chế độ tương tác:

import xml.etree.ElementTree as ET
root = ET.fromstring('<parent><child></child></parent>')
child = root.find('child')
parent = child.find('..') # retrieve the parent
parent is None # unexpected answer True

Câu trả lời cuối cùng phá vỡ mọi hy vọng ...

Đã trả lời ngày 4 tháng 7 năm 2018 lúc 7:56Jul 4, 2018 at 7:56

Jlaurensjlaurensjlaurens

4794 Huy hiệu bạc10 Huy hiệu đồng4 silver badges10 bronze badges

Nếu bạn đang sử dụng LXML, tôi đã có thể lấy phần tử cha mẹ sau:

parent_node = next(child_node.iterancestors())

Điều này sẽ tăng ngoại lệ

parent_map = {}
for p in tree.iter():
    for c in p:
        if c in parent_map:
            parent_map[c].append(p)
            # Or raise, if you don't want to allow this.
        else:
            parent_map[c] = [p]
            # Or parent_map[c] = p if you don't want to allow this
2 nếu phần tử không có tổ tiên - vì vậy hãy chuẩn bị để bắt được nếu bạn có thể gặp phải kịch bản đó.

Đã trả lời ngày 4 tháng 12 năm 2014 lúc 4:04Dec 4, 2014 at 4:04

ShadowshadowShadow

8.4024 Huy hiệu vàng47 Huy hiệu bạc55 Huy hiệu Đồng4 gold badges47 silver badges55 bronze badges

1

parent_map = {c:p for p in tree.iter() for c in p}
0

Hướng dẫn python xml get parent - python xml nhận cha mẹ

Michael M.

4.3734 Huy hiệu vàng12 Huy hiệu bạc32 Huy hiệu Đồng4 gold badges12 silver badges32 bronze badges

Đã trả lời ngày 16 tháng 9 lúc 6:42Sep 16 at 6:42

1

Một cách khác nếu chỉ muốn một phụ huynh của một Subelement và cũng được biết đến XPath của Subelement.

parent_map = {c:p for p in tree.iter() for c in p}
1

Đã trả lời ngày 23 tháng 2 năm 2014 lúc 2:41Feb 23, 2014 at 2:41

MK tại Sohomk tại SohoMK at Soho

3221 Huy hiệu vàng3 Huy hiệu bạc1 gold badge3 silver badges10 bronze badges

2

Nhìn vào 19.7.2.2. Phần: Cú pháp XPath được hỗ trợ ...

Tìm cha mẹ của nút bằng cách sử dụng đường dẫn:

parent_map = {c:p for p in tree.iter() for c in p}
2

Đã trả lời ngày 13 tháng 12 năm 2017 lúc 23:29Dec 13, 2017 at 23:29

3