سؤال

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

للأسف, في حين أعرف XML نموذج جيدا إلى حد ما .صافي انا غير مؤكد ما إيجابيات وسلبيات XML نماذج في بيثون.

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

هل كانت مفيدة؟

المحلول

شخصيا, لقد لعبت مع العديد من المدمج في خيارات على XML الثقيلة المشروع قد استقر على pulldom كما أفضل خيار أقل الوثائق المعقدة.

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

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

نصائح أخرى

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

وأظل المغلف منذ استجابة الظرف هو (تقريبا) نفس الطلب المغلف.ثم منذ هيكل البيانات (ربما متداخلة) قاموس, إنشاء سلسلة يتحول هذا القاموس في <key>القيمة</key> البنود.

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

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

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

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

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

لديك لتثبيته ، ولكن في كثير من الأماكن ، فمن المفترض بالفعل أن يكون جزء من المعدات القياسية (على سبيل المثالجوجل لمحرك تطبيقات لا تسمح ج-على أساس الثعبان حزم ، ولكن يجعل استثناء 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 هو أنه يجب أن تكون مترجمة.انظر لذلك الإجابة لمزيد من النصائح كيفية تثبيت lxml من عجلة شكل حزمة غضون جزء من الثانية.

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

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

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

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

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