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']
- 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]:
[,
,
]
0Nế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:
1doc.xpath['/item/*[count[child::*] = 0]'] Out[20]: [, , ]
XML trông như thế này:
2doc.xpath['/item/*[count[child::*] = 0]'] Out[20]: [, , ]
Làm cách nào để kiểm tra xem
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?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']