2011-10-29 87 views
8

* Lưu ý: lxml sẽ không chạy trên hệ thống của tôi. Tôi đã hy vọng tìm ra một giải pháp không liên quan đến lxml.Phân tích cú pháp XML của Python

Tôi đã trải qua một số tài liệu xung quanh ở đây rồi và đang gặp khó khăn trong việc thực hiện điều này để làm việc theo cách tôi muốn. Tôi muốn phân tích cú pháp một số tệp XML có dạng như sau:

<dict> 
    <key>1375</key> 
    <dict> 
     <key>Key 1</key><integer>1375</integer> 
     <key>Key 2</key><string>Some String</string> 
     <key>Key 3</key><string>Another string</string> 
     <key>Key 4</key><string>Yet another string</string> 
     <key>Key 5</key><string>Strings anyone?</string> 
    </dict> 
</dict> 

Trong tệp tôi đang cố gắng thao tác, có nhiều 'dict' theo sau này. Tôi muốn đọc qua XML và xuất ra tệp văn bản/dat trông như sau:

1375, "Một số chuỗi", "Chuỗi khác", "Còn một chuỗi khác", "Chuỗi bất kỳ ai?"

...

EOF

** Nguyên, tôi cố gắng sử dụng lxml, nhưng sau nhiều cố gắng để làm cho nó làm việc trên hệ thống của tôi, tôi chuyển sang sử dụng DOM. Gần đây, tôi đã thử sử dụng Etree để thực hiện tác vụ này. Xin vui lòng, cho tình yêu của tất cả những gì là tốt, ai đó sẽ giúp tôi cùng với điều này? Tôi tương đối mới với Python và muốn tìm hiểu cách thức hoạt động của nó. Tôi cảm ơn bạn trước.

+1

Hệ điều hành và phiên bản Python nào? – Acorn

+0

Bạn có số 1375 hai lần. Đây có thể là hai con số khác nhau không? Nếu vậy, bạn muốn gì? –

Trả lời

10

Bạn có thể sử dụng xml.etree.ElementTree được bao gồm trong Python. Có một đồng hành C kèm theo (tức là nhanh hơn nhiều) xml.etree.cElementTree. lxml.etree cung cấp một bộ siêu chức năng nhưng không cần thiết cho những gì bạn muốn làm.

Các mã được cung cấp bởi các công trình @Acorn hệt cho tôi (Python 2.7, Windows 7) với mỗi hàng hoá nhập khẩu sau:

import xml.etree.ElementTree as et 
import xml.etree.cElementTree as et 
import lxml.etree as et 
... 
tree = et.fromstring(xmltext) 
... 

OS gì bạn đang sử dụng và những vấn đề cài đặt bạn đã có với lxml?

+0

Tôi đang sử dụng cài đặt Netbook Ubuntu Maverick Meerkat ... nỗ lực cài đặt lxml mới nhất bao gồm thông báo này trong thiết bị đầu cuối của tôi: Giải nén python-lxml (từ .../python-lxml_2 .2.6-1_i386.deb) ... Thiết lập firmware-b43-installer (4.150.10.5-4) ... Không hỗ trợ chip năng lượng thấp với PCI id 14e4: 4315! Hủy bỏ. – PleaseHelpTheNewGuy

+0

Tôi vừa thử nhập khẩu mới bằng mã và nhận được lỗi này: Traceback (cuộc gọi gần đây nhất): Tệp "/home/worky.py", dòng 5, trong nhập lxml.etree làm et ImportError: Không mô-đun tên là lxml.etree – PleaseHelpTheNewGuy

+0

(1) Giới thiệu về vấn đề cài đặt Ubuntu của bạn: Tôi khuyên bạn nên thử danh sách gửi thư lxml. (2) "Không có mô-đun tên lxml.etree" ... đó là bởi vì nó không được cài đặt. Chỉ có một lần nhập một lúc; bình luận cho hai người còn lại. –

7
import xml.etree.ElementTree as et 
import csv 

xmltext = """ 
<dicts> 
    <key>1375</key> 
    <dict> 
     <key>Key 1</key><integer>1375</integer> 
     <key>Key 2</key><string>Some String</string> 
     <key>Key 3</key><string>Another string</string> 
     <key>Key 4</key><string>Yet another string</string> 
     <key>Key 5</key><string>Strings anyone?</string> 
    </dict> 
</dicts> 
""" 

f = open('output.txt', 'w') 

writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) 

tree = et.fromstring(xmltext) 

# iterate over the dict elements 
for dict_el in tree.iterfind('dict'): 
    data = [] 
    # get the text contents of each non-key element 
    for el in dict_el: 
     if el.tag == 'string': 
      data.append(el.text) 
     # if it's an integer element convert to int so csv wont quote it 
     elif el.tag == 'integer': 
      data.append(int(el.text)) 
    writer.writerow(data) 
+0

Cảm ơn bạn đã đăng bài sớm như vậy. Vấn đề là, tôi không thể lấy lxml để chạy trên máy tính của tôi. Tôi có python 2,7 và đã thực hiện một số nỗ lực để có được mô-đun cài đặt, nhưng đã thất bại. Tôi đã hy vọng có một cách khác mà không liên quan đến lxml. – PleaseHelpTheNewGuy

+1

Bạn đang chạy hệ điều hành nào? – Acorn

+0

Tôi đang chạy phiên bản Netbook Ubuntu Maverick Meerkat ... – PleaseHelpTheNewGuy

Các vấn đề liên quan