Hướng dẫn python check if xml element has child - python kiểm tra xem phần tử xml có con không

Cá nhân tôi khuyên bạn nên sử dụng trình phân tích cú pháp XML hỗ trợ đầy đủ các biểu thức XPath. Tập hợp con được hỗ trợ bởi

doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]
3 là không đủ cho các nhiệm vụ như thế này.

Ví dụ, trong

doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]
4 tôi có thể làm:

"Đưa cho tôi tất cả trẻ em của những đứa trẻ của nút

doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]
5":

doc.xpath['//item/*/child::*'] #equivalent to '//item/*/*', if you're being terse
Out[18]: [, ]

or,

"Đưa cho tôi tất cả những đứa con của ____ 15 không có con":

doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]

or,

"Đưa cho tôi tất cả các yếu tố không có con":

doc.xpath['//*[count[child::*] = 0]']
Out[29]: 
[,
 ,
 ,
 ,
 ]

# and if I only care about the text from those nodes...
doc.xpath['//*[count[child::*] = 0]/text[]']
Out[30]: ['value1', 'value2', 'value3', 'value222', 'value22']

  1. Kiểm tra xem phần tử XML có con hay không, trong ElementTree

Giải pháp 1

Bạn có thể thử chức năng

doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]
7 trên phần tử:

>>> xml = """
  value1
  value2
  value3
  
    value222
    value22
  
"""
>>> root = ET.fromstring[xml]
>>> list[root[0]]
[]
>>> list[root[3]]
[, ]
>>> len[list[root[3]]]
2
>>> print "has children" if len[list[root[3]]] else "no child"
has children
>>> print "has children" if len[list[root[2]]] else "no child"
no child
>>> # Or simpler, without a call to list within len, it also works:
>>> print "has children" if len[root[3]] else "no child"
has children

Tôi đã sửa đổi mẫu của bạn vì chức năng

doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]
8 gọi trên root
doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]
9 không hoạt động [vì
doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]
8 sẽ tìm kiếm hậu duệ trực tiếp chứ không phải là phần tử hiện tại]. Nếu bạn muốn truy cập văn bản của các con sau đó trong chương trình làm việc của bạn, bạn có thể làm:

for child in root.findall["item"]:
  # if there are children, get their text content as well.
  if len[child]: 
    for subchild in child:
      subchild.text
  # else just get the current child text.
  else:
    child.text

Đây sẽ là một phù hợp tốt cho một đệ quy mặc dù.

Giải pháp 2

Cách đơn giản nhất tôi có thể tìm thấy là sử dụng trực tiếp giá trị

doc.xpath['//*[count[child::*] = 0]']
Out[29]: 
[,
 ,
 ,
 ,
 ]

# and if I only care about the text from those nodes...
doc.xpath['//*[count[child::*] = 0]/text[]']
Out[30]: ['value1', 'value2', 'value3', 'value222', 'value22']
1 của phần tử. Điều này có nghĩa là bạn có thể sử dụng
doc.xpath['//*[count[child::*] = 0]']
Out[29]: 
[,
 ,
 ,
 ,
 ]

# and if I only care about the text from those nodes...
doc.xpath['//*[count[child::*] = 0]/text[]']
Out[30]: ['value1', 'value2', 'value3', 'value222', 'value22']
2 trong một câu lệnh có điều kiện AS-IS:

a4 = Element['a4']
if a4:
    print['Has kids']
else:
    print['No kids yet']

a4.append[Element['x']]
if a4:
    print['Has kids now']
else:
    print['Still no kids']

Chạy mã này sẽ in

No kids yet
Has kids now

Giá trị boolean của một phần tử không nói bất cứ điều gì về

doc.xpath['//*[count[child::*] = 0]']
Out[29]: 
[,
 ,
 ,
 ,
 ]

# and if I only care about the text from those nodes...
doc.xpath['//*[count[child::*] = 0]/text[]']
Out[30]: ['value1', 'value2', 'value3', 'value222', 'value22']
3,
doc.xpath['//*[count[child::*] = 0]']
Out[29]: 
[,
 ,
 ,
 ,
 ]

# and if I only care about the text from those nodes...
doc.xpath['//*[count[child::*] = 0]/text[]']
Out[30]: ['value1', 'value2', 'value3', 'value222', 'value22']
4 hoặc các thuộc tính. Nó chỉ chỉ ra sự hiện diện hay vắng mặt của trẻ em, đó là những gì câu hỏi ban đầu được hỏi.

Giải pháp 3

Cá nhân tôi khuyên bạn nên sử dụng trình phân tích cú pháp XML hỗ trợ đầy đủ các biểu thức XPath. Tập hợp con được hỗ trợ bởi

doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]
3 là không đủ cho các nhiệm vụ như thế này.

Ví dụ, trong

doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]
4 tôi có thể làm:

"Đưa cho tôi tất cả trẻ em của những đứa trẻ của nút

doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]
5":

doc.xpath['//item/*/child::*'] #equivalent to '//item/*/*', if you're being terse
Out[18]: [, ]

or,

"Đưa cho tôi tất cả những đứa con của ____ 15 không có con":

doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]

or,

"Đưa cho tôi tất cả các yếu tố không có con":

doc.xpath['//*[count[child::*] = 0]']
Out[29]: 
[,
 ,
 ,
 ,
 ]

# and if I only care about the text from those nodes...
doc.xpath['//*[count[child::*] = 0]/text[]']
Out[30]: ['value1', 'value2', 'value3', 'value222', 'value22']

Giải pháp 4

Có thể sử dụng một phương pháp rất đơn giản

doc.xpath['/item/*[count[child::*] = 0]']
Out[20]: 
[,
 ,
 ]
0

Nếu danh sách trống thì không có con ở đó.

Bình luận

  • Tôi lấy một tài liệu XML theo cách này:

    doc.xpath['/item/*[count[child::*] = 0]']
    Out[20]: 
    [,
     ,
     ]
    
    1

    XML trông như thế này:

    doc.xpath['/item/*[count[child::*] = 0]']
    Out[20]: 
    [,
     ,
     ]
    
    2

    Làm cách nào để kiểm tra xem

    doc.xpath['//*[count[child::*] = 0]']
    Out[29]: 
    [,
     ,
     ,
     ,
     ]
    
    # and if I only care about the text from those nodes...
    doc.xpath['//*[count[child::*] = 0]/text[]']
    Out[30]: ['value1', 'value2', 'value3', 'value222', 'value22']
    
    2 [trong trường hợp cụ thể này, nhưng nó có thể là bất kỳ yếu tố nào khác] có con không?

Recents

Làm cách nào để tìm một thẻ cụ thể trong XML trong Python?

Sử dụng XML ...
cây = ElementTree. Parse ["Sample.xml"].
root = cây. getroot [].
Chó = Root. Findall ["Dog"].
cho chó ở chó:.
In [chó. Văn bản].

XML Etree ElementTree là gì?

Mô -đun xml.etree.elementtree thực hiện API đơn giản và hiệu quả để phân tích và tạo dữ liệu XML.Thay đổi trong phiên bản 3.3: Mô -đun này sẽ sử dụng triển khai nhanh bất cứ khi nào có sẵn.implements a simple and efficient API for parsing and creating XML data. Changed in version 3.3: This module will use a fast implementation whenever available.

Làm thế nào để bạn xử lý XML trong Python?

Để đọc một tệp XML bằng ElementTree, trước tiên, chúng tôi nhập lớp ElementTree được tìm thấy bên trong thư viện XML, dưới tên ET [thông tin chung].Sau đó chuyển tên tệp của tệp XML cho ElementTree.Phương thức Parse [], để cho phép phân tích tệp XML của chúng tôi.Sau đó, nhận được gốc [thẻ cha] của tệp XML của chúng tôi bằng GetRoot [].

Làm thế nào để bạn thêm thẻ XML trong Python?

Thêm chúng bằng hàm subelement [] và xác định thuộc tính văn bản của nó ...
con = xml.Phần tử ["nhân viên"] nm = xml.Subelement [trẻ em, "Tên"] nm.Văn bản = Sinh viên.....
Nhập XML.Etree.ElementTree là Et Tree = et.ElementTree [file = 'nhân viên.xml'] root = cây.....
Nhập XML.Etree.ElementTree là Et Tree = et ..

Bài Viết Liên Quan

Chủ Đề