Python XML İşleme

oy
61

Ben inşa ve bir web servisine XML belgesini yayınlamak gerekir ve bunun içinde becerilerimi genişletmek için bir araç olarak, Python bunu yapmak istediğiniz bir projede bir parça oluşturmak üzereyim.

Oldukça iyi .NET XML model belli iken yazık ki, ben lehte ve aleyhte Python XML modelleri nelerdir belirsiz değilim.

Herkes Python XML işleme yapıyor deneyime sahip? Bunu nerede başlar önerirsiniz? Ben bina olacak XML dosyaları oldukça basit olacaktır.

Oluştur 02/08/2008 saat 04:35
kaynak kullanıcı
Diğer dillerde...                            


16 cevaplar

oy
30

Elementtree güzel pythony API vardır. Ben bile piton 2.5 parçası olarak sevk düşünüyorum

Saf Python var ve dediklerimi, oldukça güzel, ancak daha fazla performans ihtiyacı kadar rüzgar varsa, o zaman Lxml aynı API ortaya çıkarır ve kaputun altında libxml2 kullanır. Sen teorik sadece İhtiyacınız keşfettiklerinde bunu değiştirebilirsiniz.

Cevap 02/08/2008 saat 16:21
kaynak kullanıcı

oy
22

Şahsen ben bir XML-ağır projede yerleşik seçeneklerin çeşitli ile oynadım ve yerleşmiş pulldom az karmaşık belgeler için en iyi seçim olarak görülüyor.

Özellikle küçük basit şeyler için, ben ayrıştırma yerine nispeten basit bir yapı için geri aramaları bir bütün yığın kurma olaya dayalı teoriyi gibi. İşte API nasıl kullanılacağına ilişkin iyi bir hızlı tartışmadır .

Ne gibi: Bir de ayrıştırmayı işleyebilir foryerine geri aramalar kullanmak yerine döngü. Ayrıca tam ayrıştırılmasını ( "çekme" bölümü) geciktirmek ve aradığınızda sadece ek ayrıntı olsun expandNode(). Bu kullanım ve sadelik kolaylığı ödün vermeden "sorumlu" verimlilik için benim genel gereksinimi karşılar.

Cevap 02/08/2008 saat 05:01
kaynak kullanıcı

oy
6

Dalış Into Python bir bölüm vardır. Olsa ne kadar iyi olurdu için kefil olamaz.

Cevap 02/08/2008 saat 04:43
kaynak kullanıcı

oy
5

Bu belge olması gerekiyor ne kadar karmaşık bağlıdır.Örneğin.

Ben XML yazmak için minidom çok kullandım, ama bu genellikle sadece, belgeleri okuma bazı basit dönüşümler yapma ve geri onları yazmaya oldu. Ben (düzgün XML ayrıştırmak değil eski bir uygulamayı gerçekleştirmek için) eleman özelliklerini sipariş etme ihtiyacı kadar bu yeterince iyi çalıştı. Bu noktada vazgeçtim ve XML kendim yazdım.

Yalnızca, basit belgeler üzerinde çalışıyorsanız sonra kendinize bir çerçeve öğrenme daha hızlı ve daha basit olabilir yapıyor. Eğer makul elle XML yazabilirsiniz, o zaman muhtemelen elle kodlayabiliriz yanı (sadece özel karakterlerden ve kullanmayı unutmayın str.encode(codec, errors="xmlcharrefreplace")). Bunun dışında snafus gelen XML sen olmadığını yeterince düzenli ihtiyaç yazmak için özel bir kütüphane. Belge elle yazmak için çok karmaşık ise, o zaman zaten bahsedilen çerçeveler birine bakmak gerekir. Hiçbir noktada genel bir XML yazar yazmaya gerek olmalıdır.

Cevap 14/10/2008 saat 19:26
kaynak kullanıcı

oy
5

Birkaç projeler için elementtree kullanılan ve bunu tavsiye ettik.

Bu c versiyonu cElementTree saf Python sürümü 20 kat daha hızlıdır ve kullanımı çok kolaydır (xml.etree.cElementTree) dahil, Python 2.5 ile 'kutusuna' geliyor, pythonic bu.

Lxml bazı perfomansı avantajları vardır, ancak bunlar pürüzlü ve size kullanım durumu için ilk kriterler kontrol etmelidir.

Anladığım kadarıyla, elementtree kod kolayca LXML için taşıdık olabilir.

Cevap 23/09/2008 saat 20:42
kaynak kullanıcı

oy
5

dom, saksafon ve xpath: genel olarak XML ile uğraşan 3 majör yolu vardır. aynı anda belleğe tüm xml dosyasını yüklemek için göze ve veri yapıları ile ilgili sakıncası yoksa dom modeli iyidir ve / en çok modelin en arıyoruz. Yalnızca birkaç etiketleri ile ilgili bakım ve / veya Büyük dosyalarla ilgileniyor ve sırayla bunları işleyebilir eğer saksafon modeli harika. Eğer almak ve ihtiyacınız veri elemanlarına yolları tercih olabilir, ama kullanmak daha kütüphaneleri gerektirir - xpath modeli her bir biraz.

Eğer basit ve Python ile paketlenmiş istiyorsanız, minidom Cevabınız, ama oldukça topal ve dokümantasyon "onu anlamaya go burada dom üzerinde doküman var" dır. Gerçekten sinir bozucu.

Şahsen ben bir dom benzeri modeldir elementtree, daha hızlı (c bazlı) uygulamasıdır cElementTree, gibi.

Ben saksafon sistemlerini kullandım ve birçok yönden kendi his daha "pythonic" konum, ama genellikle bunları işlemek için devlet temelli sistemler oluşturma sonunda ve bu şekilde delilik (ve böcek) yatıyor.

Sana iyi çalışıyor iyi kod istiyorsanız araştırmayı severim, ya elementtree eğer minidom yönel derim.

Cevap 16/09/2008 saat 05:35
kaynak kullanıcı

oy
4

Ayrıca deneyebilirsiniz untangle basit XML belgeleri ayrıştırmak için.

Cevap 31/10/2011 saat 15:05
kaynak kullanıcı

oy
4

Ben XML istekleri alır ve XML yanıtları yaratan bir SOAP sunucusu yazın. (Ne yazık ki, benim proje değil, bu yüzden kapalı kaynağıdır, ama bu başka sorun da).

Bu şema "uyan" bir veri yapısını varsa (SOAP) XML belge, oldukça basit olduğunu benim için çıktı.

yanıtı zarf isteği zarf ile aynı (neredeyse) olduğundan Zarfı tutun. Benim veri yapısı (muhtemelen iç içe) sözlük olduğundan Sonra, ben <key> değeri </ tuşu> öğeleri içine bu sözlüğü döner bir dize oluşturun.

Bu özyineleme basit hale getiren bir iştir ve doğru yapısı ile bitirmek. Bu, tüm piton kodunda yapılır ve üretim amaçlı anda yeterince hızlı olduğunu edilir.

Eğer uzunluk ipuçları vermedikçe müşterinize bağlı sorunlarla vurmak rağmen Ayrıca (nispeten) kolayca yanı listeleri oluşturabilirsiniz.

bir sözlük bazı özel sınıfından daha çalışma çok daha kolay bir yoludur beri Benim için bu, çok daha basit oldu. kitaplar için, XML üreten ayrıştırma çok daha kolaydır!

Cevap 03/08/2008 saat 09:34
kaynak kullanıcı

oy
3

Python kullanımı lxml XML ile ciddi çalışma için

Python kütüphanesinde inşa elementtree ile gelir, ama Lxml hızı ve işlevselliği (şema doğrulama, saksofon ayrıştırma, XPath, Yineleyicilerin değişik çeşit ve birçok diğer özellikleri) bakımından da genişletir.

Bunu yüklemek zorunda, ama birçok yerde zaten standart ekipman parçası olduğu varsayılır (örneğin Google AppEngine C tabanlı Python paketlerini izin vermez, ancak LXML, PyYAML ve birkaç diğerleri için istisna yapar).

E-fabrika XML belgeleri Bina (LXML itibaren)

Sorunuz XML belgesi bina ile ilgili.

LXML ile pek çok yöntem ve kullanımı kolay ve aynı zamanda okunması kolay gibi görünüyor birini bulmak için biraz zaman aldı.

Örnek kod e-fabrika kullanımı hakkında Lxml doc (hafifçe basitleştirilmiş):


E-fabrika XML ve HTML oluşturma için basit ve kompakt sözdizimi sağlamaktadır:

>>> from lxml.builder import E

>>> html = page = (
...   E.html(       # create an Element called "html"
...     E.head(
...       E.title("This is a sample document")
...     ),
...     E.body(
...       E.h1("Hello!"),
...       E.p("This is a paragraph with ", E.b("bold"), " text in it!"),
...       E.p("This is another paragraph, with a", "\n      ",
...         E.a("link", href="http://www.python.org"), "."),
...       E.p("Here are some reserved characters: <spam&egg>."),
...     )
...   )
... )

>>> print(etree.tostring(page, pretty_print=True))
<html>
  <head>
    <title>This is a sample document</title>
  </head>
  <body>
    <h1>Hello!</h1>
    <p>This is a paragraph with <b>bold</b> text in it!</p>
    <p>This is another paragraph, with a
      <a href="http://www.python.org">link</a>.</p>
    <p>Here are some reserved characters: &lt;spam&amp;egg&gt;.</p>
  </body>
</html>

Ben e-fabrikada aşağıdaki şeyler üzerinde takdir

Kod Sonuç XML belgesi olarak neredeyse okur

Hassasiyet sayar.

Herhangi bir XML içeriğinin oluşturulmasına izin verir

şeyler gibi destekler:

  • ad kullanımı
  • bir eleman olan metin düğümleri başlangıç ​​ve bitiş
  • nitelik içeriği biçimlendirme fonksiyonları (içinde fonk CLASS bakınız tam Lxml numunesi )

listeleri ile çok okunabilir yapıları tanır

Örneğin:

from lxml import etree
from lxml.builder import E
lst = ["alfa", "beta", "gama"]
xml = E.root(*[E.record(itm) for itm in lst])
etree.tostring(xml, pretty_print=True)

sonuçlanan:

<root>
  <record>alfa</record>
  <record>beta</record>
  <record>gama</record>
</root>

Sonuçlar

çok iyi yazılmıştır ve bu güçlü kütüphaneyi kullanmak için birçok iyi nedeni sağlayan - Çok Lxml öğretici okuma önerilir.

LXML tek dezavantajı derlenmiş gerektiğini vardır. Bkz SO fazla ipucu için cevap saniyenin fraksiyonu içinde tekerlek biçimi paketinden LXML yükleme.

Cevap 17/04/2014 saat 22:32
kaynak kullanıcı

oy
3

Ben şahsen o bölüm düşünmek Python içine dalış harika. İlk dikkat edin - bu minidom modülünü kullanan ve yazma oldukça iyi bir parçadır.

Cevap 11/08/2008 saat 19:02
kaynak kullanıcı

oy
3

Eğer "oldukça basit" XML, bina olacak belirtti yana minidom modülü (Python Standart Kütüphanesi parçası) ihtiyaçlarınızı olasılıkla uygun olacaktır. XML DOM gösterimi ile herhangi bir deneyim varsa, oldukça yalındır API bulmalıdır.

Cevap 02/08/2008 saat 19:04
kaynak kullanıcı

oy
1

Bunu ile işlevsellik için Lxml kullanmak gerektiğini düşünüyorum

Cevap 08/10/2014 saat 06:58
kaynak kullanıcı

oy
1

XML için Basit API - - Python kitaplıklarında uygulanmasını şiddetle SAX önerilir. Burada önceki posterleri ile tartışıldığı gibi, hatta tahrik API tarafından kurulum ve süreç büyük XML oldukça kolaydır ve DOM stil XML ayrıştırıcıları doğrulayarak aksine düşük bellek ayak izi var.

Cevap 12/12/2012 saat 04:25
kaynak kullanıcı

oy
1

Eğer SOAP mesajları bina edilecek gidiyoruz, kontrol soaplib . Bu başlık altında elementtree kullanır, ancak seri ve mesajları deserializing için çok daha temiz bir arayüz sağlar.

Cevap 13/10/2008 saat 23:17
kaynak kullanıcı

oy
1

Ben işleme XML .Net yönlü MSXML'nin'som sürümü üzerine inşa varsayalım ve bu durum ben örnek minidom için kullanarak evde biraz hissettirmek olacağını varsayıyoruz. Ancak, muhtemelen yapacak herhangi kütüphane yapıyoruz işleme basitse.

Python xml ile uğraşırken Ben de elementtree çalışmayı tercih, çok düzgün kütüphanesidir.

Cevap 16/09/2008 saat 07:20
kaynak kullanıcı

oy
1

Geçenlerde başarı ile Amara kullanmaya başladı.

Cevap 11/08/2008 saat 23:40
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more