تعطيل Adblock

Adblock يحظر بعض المحتوى على الموقع

ADBlock errore

سؤال

وأنا على وشك بناء قطعة من المشروع الذي سوف تحتاج إلى بناء والرد على وثيقة XML لخدمة الويب وأود أن تفعل ذلك في بيثون، كوسيلة لتوسيع مهاراتي في ذلك.

ولسوء الحظ، في حين وأنا أعلم أن نموذج XML بشكل جيد في .NET، أنا غير مؤكد ما إيجابيات وسلبيات هي من نماذج XML في بيثون.

وأي شخص لديه خبرة القيام معالجة XML في بيثون؟ حيث تقترح أن أبدأ؟ سوف ملفات XML سأكون بناء تكون بسيطة إلى حد ما.

المحلول

وشخصيا، لقد لعبت مع العديد من الخيارات المدمج في على مشروع XML الثقيلة واستقروا على <لأ href = "http://docs.python.org/lib/module-xml.dom. pulldom.html "يختلط =" noreferrer "> pulldom كأفضل خيار للمستندات أقل تعقيدا.

وخاصة بالنسبة للأشياء بسيطة صغيرة، وأنا أحب نظرية الحدث يحركها من تحليل بدلا من وضع مجموعة كاملة من الاسترجاعات للبنية بسيطة نسبيا. هنا هو مناقشة سريعة جيدة لكيفية استخدام API .

وما يعجبني: يمكنك التعامل مع الاعراب في حلقة for بدلا من استخدام الاستدعاء. يمكنك أيضا تأخير التوزيع الكامل (على "سحب" جزء) وفقط الحصول على تفاصيل إضافية عند استدعاء expandNode(). هذا يرضي بلدي المتطلبات العامة لكفاءة "مسؤولة" من دون التضحية سهولة الاستخدام والبساطة.

نصائح أخرى

ElementTree ديه API pythony لطيفة. أعتقد أنه حتى شحنها كجزء من الثعبان 2.5

وانها في بيثون نقية وكما قلت، لطيفة جدا، ولكن إذا كنت تصل الرياح التي تحتاج إلى المزيد من الأداء، ثم lxml يفضح نفسه API ويستخدم libxml2 تحت غطاء محرك السيارة. يمكنك نظريا فقط مبادلة في عندما تكتشف كنت في حاجة إليها.

وهناك 3 طرق رئيسية للتعامل مع XML، بشكل عام: دوم، ساكس، و XPath. نموذج دوم جيد إذا كنت تستطيع تحميل ملف xml بأكمله في الذاكرة في آن واحد، وكنت لا تمانع في التعامل مع هياكل البيانات، وكنت تبحث في كثير / أكثر من نموذج. نموذج ساكس كبيرة إذا كنت لا يهتمون إلا عدد قليل من العلامات، و / أو كنت تتعامل مع الملفات الكبيرة، ويمكن معالجتها بشكل تسلسلي. نموذج كسباث هو قليلا من كل - يمكنك انتقاء واختيار المسارات إلى عناصر البيانات التي تحتاج إليها، ولكنه يتطلب المزيد من المكتبات لاستخدام

إذا كنت تريد واضحة وتعبئتها مع بيثون، minidom هو جوابك، لكنها عرجاء جدا، والوثائق هو "هنا هو مستندات على دوم، انتقل الرقم بها". إنه أمر مزعج حقا.

وشخصيا، أحب cElementTree، وهو أسرع (على أساس ج) تنفيذ ElementTree، وهو نموذج مثل دوم.

ولقد استعملت أنظمة ساكس، وبطرق عديدة أنهم أكثر "pythonic" في الشعور، ولكن أنا عادة في نهاية المطاف خلق النظم القائمة على الدولة التعامل معها، وبهذه الطريقة يكمن الجنون (والبق).

وأقول يذهب مع minidom إذا كنت مثل البحوث، أو ElementTree إذا كنت تريد كود الجيد الذي يعمل بشكل جيد.

ولقد استعملت ElementTree لعدة مشاريع، وأوصى به.

وانها pythonic، ويأتي "في مربع" مع بيثون 2.5، بما في ذلك ج النسخة cElementTree (xml.etree.cElementTree) الذي هو 20 مرات أسرع من الإصدار بيثون النقي، وسهل جدا للاستخدام.

وlxml لديه بعض المزايا برفومنس، لكنها متفاوتة، ويجب أن تحقق المعايير أولا لحالة استخدامك.

وكما أفهم، رمز ElementTree يمكن بسهولة استدار إلى lxml.

وذلك يعتمد قليلا على مدى تعقيد تحتاج الوثيقة أن تكون.

ولقد استعملت minidom الكثير لكتابة XML، ولكن هذا كان مجرد عادة قراءة وثائق، مما يجعل بعض التحولات بسيطة، والكتابة عليها العودة. التي عملت جيدا بما فيه الكفاية حتى أنا في حاجة الى القدرة لأجل سمات العنصر (لتلبية الطلب القديمة التي لا يتم تحليل XML بشكل صحيح). عند هذه النقطة فاكتفيت وكتب XML نفسي.

إذا كنت تعمل فقط على وثائق بسيطة، ثم فعل ذلك بنفسك يمكن أن يكون أسرع وأسهل من تعلم الإطار. إذا كان يمكنك تصور كتابة XML من جهة، ثم يمكنك ربما رمز باليد وكذلك (فقط تذكر للهروب بشكل صحيح أحرف خاصة، واستخدام str.encode(codec, errors="xmlcharrefreplace")). وبصرف النظر عن هذه سنافوس، XML غير منتظمة بما يكفي أنك لا <م> الحاجة مكتبة خاصة لأنه يكتب. إذا كانت الوثيقة معقدة جدا لكتابة باليد، ثم ربما يجب عليك النظر إلى واحدة من الأطر التي سبق ذكرها. في أي لحظة أن كنت في حاجة لكتابة الكاتب XML العام.

ويمكنك أيضا محاولة فك لتحليل وثائق XML بسيطة.

وبما أنك ذكرت أن عليك أن تكون بناء "بسيط نسبيا" XML، في minidom حدة (جزء من مكتبة القياسية بيثون) من المرجح أن تلائم الاحتياجات الخاصة بك. إذا كان لديك أي خبرة مع التمثيل DOM من XML، يجب أن تجد API تماما على التوالي إلى الأمام.

وأنا أكتب الخادم SOAP الذي يتلقى طلبات XML ويخلق ردود XML. (لسوء الحظ، انها ليست بلدي المشروع، لذلك فمن مغلقة المصدر، ولكن هذا مشكلة أخرى).

واتضح لي أن خلق (SOAP) وثائق XML بسيطة إلى حد ما إذا كان لديك بنية بيانات أن "يناسب" المخطط.

وأظل المغلف منذ المغلف الاستجابة (تقريبا) نفس الطلب المغلف. ثم، منذ بنية البيانات الخاصة بي هو (ربما متداخلة) القاموس، وإنشاء سلسلة يتحول هذا القاموس إلى <الرئيسية> قيمة العناصر.

وهذه هي المهمة التي العودية يجعل بسيطة، وأنا في نهاية المطاف مع الهيكل الصحيح. وفعلت كل هذا في التعليمات البرمجية الثعبان وحاليا بسرعة كافية للاستخدام الإنتاج.

ويمكنك أيضا (نسبيا) بسهولة بناء قوائم أيضا، على الرغم من أن هذا يتوقف على العميل الخاص بك، قد ضرب المشاكل إلا إذا كنت تعطي تلميحات طول.

وبالنسبة لي، وهذا كان أبسط من ذلك بكثير، لأن القاموس هو وسيلة أسهل بكثير من العمل من بعض فئة مخصصة. للكتب، وتوليد XML هو أسهل بكثير من تحليل!

تحليل لعمل جاد مع XML في بيثون استخدام lxml

ويأتي بيثون مع ElementTree المدمج في مكتبة، ولكن lxml يمتد ذلك من حيث السرعة والأداء الوظيفي (التحقق من صحة المخطط، إعراب ساكس، كسباث، أنواع مختلفة من التكرارات والعديد من الميزات الأخرى).

لديك لتثبيته، ولكن في كثير من الأماكن، ويفترض أن تكون جزءا من المعدات القياسية (مثل جوجل إلى AppEngine لا يسمح حزم بيثون القائم على C، ولكن يجعل استثناء لlxml، pyyaml، وقليل من الآخرين) .

تحليل الوثائق بناء XML مع E-المصنع (من lxml)

وسؤالك عن بناء وثيقة XML.

ومع lxml هناك العديد من الأساليب واستغرق الأمر مني بعض الوقت للعثور على واحد، والذي يبدو ليكون سهل الاستخدام وأيضا سهلة القراءة.

lxml ثيقة على استخدام E-مصنع (ومبسطة قليلا ):


والمصنع E يوفر تركيب بسيط وصغير لتوليد XML و HTML:

>>> 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>

وأنا أقدر على المصنع E ذلك الأمور التالية

كود يقرأ تقريبا كوثيقة XML الناتجة

والمقروئية تحصي.

يسمح بإنشاء أي محتوى XML

ويدعم الاشياء مثل:

  • واستخدام النطاقات
  • والبداية والنهاية النص العقد في عنصر واحد
  • وظائف تنسيق المحتوى سمة (انظر الدرجة ظائفها في lxml الكامل نموذجا )

يسمح بنيات للقراءة جدا مع قوائم

ومنها مثلا:

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)

ومما أدى إلى:

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

الاستنتاجات

وأنا أوصي القراءة lxml التعليمي - أنه مكتوب بشكل جيد للغاية، وسوف تعطيك العديد من الأسباب لاستخدام هذه المكتبة قوية

.

والعيب الوحيد من lxml هو، وأنه يجب أن يكون ترجمة. انظر الإجابة SO لأكثر نصائح كيفية تثبيت lxml من حزمة شكل عجلة في غضون جزء من الثانية.

إذا كنت تريد الذهاب ليكون بناء رسائل SOAP، تحقق من soaplib . ويستخدم ElementTree تحت غطاء محرك السيارة، ولكنه يوفر واجهة أنظف بكثير لتسلسل وdeserializing الرسائل.

وإنني أوصي بشدة SAX - Simple API for XML - التنفيذ في المكتبات بيثون. فهي سهلة نسبيا لإعداد وعملية XML كبيرة من API حتى مدفوعة، كما ناقشها الملصقات السابقة هنا، ويكون انخفاض الذاكرة على عكس التحقق من صحة الاسلوب DOM موزعي XML.

وأفترض أن صافي في اتجاه معالجة XML يبني على بعض نسخة من MSXML وفي هذه الحالة أفترض أن استخدام على سبيل المثال minidom من شأنها أن تجعلك تشعر إلى حد ما في المنزل. ومع ذلك، إذا أنها بسيطة تجهيز تقومون به أي مكتبة من المحتمل القيام به.

وأنا أيضا يفضلون العمل مع ElementTree عند التعامل مع XML في بيثون، بل هو مكتبة أنيق جدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow