Hướng dẫn get text from xml tag python - lấy văn bản từ python thẻ xml

Tôi hy vọng đây là một câu hỏi dễ dàng. Tôi sẽ cố gắng rõ ràng về những gì tôi đang cố gắng thực hiện. Dưới đây chỉ là một đoạn nhỏ về tệp XML của tôi trông như thế nào. Những gì tôi đang cố gắng làm là xem cấu trúc phần tử có tồn tại không. Nếu vậy, mã tiến hành. Sau đó, tôi cố gắng xem qua tất cả các yếu tố và nếu phần tử con (kiểm tra) là sai, thì tôi muốn lấy văn bản của phần tử ID. Mã sau tôi có sẽ hoạt động nếu phần tử là trước phần tử. Tôi muốn đảm bảo rằng bất kỳ ID đặt hàng nào là danh sách trong (trước hoặc sau) rằng tôi nhận được ID con thích hợp thuộc về cha mẹ thích hợp. Hiện tại tôi đang sử dụng cây phần tử.

<data> <cs> <c> <id>1</id> <test>True</test> <test2>False</test2> <test3>False</test3> <test4>True</test4> </c> <c> <test>False</test> <test2>False</test2> <test3>False</test3> <id>2</id> <test4>True</test4> </c> </cs> elementTree = self.param2 isCS = elementTree.find('./cs') getCS = elementTree.findall('./cs') CIDs = [] if isCS is None: raise Exception("Unable to find the 'cs' element structure under <data>. Failed to build a list of CID's.") else: # Build the list of CID's. for cs in getCS: for c in cs: for child in c.getchildren(): if str(child.tag).lower() == 'id': myid = child.text elif str(child.tag).lower() == 'test' and str(child.text).lower() == 'false': CIDs.append(myid) print CIDs

Những gì tôi nhận được (tùy thuộc vào thứ tự mà phần tử được liệt kê) là đầu ra sau:

1

Khi tôi thực sự mong đợi như sau:

2

Tôi chỉ cần biết làm thế nào tôi có thể chạy các bài kiểm tra cụ thể trên các phần phụ của và nhận dữ liệu tùy thuộc vào những gì tôi tìm thấy trong văn bản của.

Khi được hỏi ngày 27 tháng 2 năm 2014 lúc 22:45Feb 27, 2014 at 22:45

Đây là một cách để làm điều đó:

cids = [] for c_node in tree.findall('.//cs/c'): test_node = c_node.find('test') if test_node is not None and test_node.text == 'False': id_node = c_node.find('id') cids.append(id_node.text) print cids

Thảo luận

  • Trong vòng for, tôi xác định vị trí tất cả các nút C dưới CSc nodes under cs
  • Tiếp theo, tôi đã kiểm tra xem nút "kiểm tra" có tồn tại không và là sai
  • Cuối cùng, tôi nối ID vào danh sáchid to the list

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

Hai Vuhai VuHai Vu

35K11 Huy hiệu vàng64 Huy hiệu bạc92 Huy hiệu Đồng11 gold badges64 silver badges92 bronze badges

1

Không được kiểm tra.

# Build the list of CID's. for cs in getCS: for c in cs: myid = None mytest = None for child in c.getchildren(): if str(child.tag).lower() == 'id': myid = child.text elif str(child.tag).lower() == 'test' and str(child.text).lower() == 'false': mytest = True if myid and mytest: CIDs.append(myid) print CIDs

Có lẽ nó có thể được thực hiện theo cách khác nhau - sử dụng một số chức năng đặc biệt hoặc find(), findall() trên phần tử c.

EDIT:

Ví dụ với lxml (nó chỉ là ví dụ nên nó không phải là "Bulletproof")

import lxml.etree xml = '''<data> <cs> <c> <id>1</id> <test>True</test> <test2>False</test2> <test3>False</test3> <test4>True</test4> </c> <c> <test>False</test> <test2>False</test2> <test3>False</test3> <id>2</id> <test4>True</test4> </c> </cs> </data>''' tree = lxml.etree.fromstring(xml) all_c = tree.findall('./cs/c') #print all_c results = [] for c in all_c: #print c myid = c.find('id').text mytest = (c.find('test').text.lower() == 'false') print myid, mytest if myid and mytest: results.append(myid) print "results:", results

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

Furasfurasfuras

Huy hiệu vàng 130K1111 gold badges100 silver badges144 bronze badges

2

Chủ đề