سؤال

أحاول إنشاء XML باستخدام هيكل كائن ElemerTree في Python. كل شيء يعمل بشكل جيد للغاية إلا عندما يتعلق الأمر بمعالجة التعليمات. يمكنني إنشاء PI بسهولة باستخدام تصنيع وظيفة المصنع ()، لكن لا يتم إضافته إلى elesstree. يمكنني إضافته يدويا، لكن لا يمكنني معرفة كيفية إضافته فوق عنصر الجذر حيث يتم وضع PI عادة. أي شخص يعرف كيفية القيام بذلك؟ أعرف الكثير من الأساليب البديلة للقيام بذلك، ولكن يبدو أنه يجب بناؤه في مكان ما لا يمكنني العثور عليه.

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

المحلول

جرب ال lxml المكتبة: يتبع ANDREE API، بالإضافة إلى إضافة الكثير من الإضافات. من نظرة عامة على التوافق:

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

يمكنك تعطيل هذا السلوك من خلال تمرير المنطقي remove_comments و / أو remove_pis تجواف الكلمات الرئيسية إلى المحلل الذي تستخدمه. للراحة ودعم رمز محمول، يمكنك أيضا استخدام etree.ETCompatXMLParser بدلا من الافتراضي etree.XMLParser. وبعد يحاول تقديم برنامج إعداد افتراضي يقترب من GenterTree Parser قدر الإمكان.

ليس في Stdlib، وأنا أعلم، ولكن في تجربتي أفضل رهان عندما تحتاج إلى الأشياء التي لا توفر elertree القياسية.

نصائح أخرى

مع API LXML، لا يمكن أن يكون الأمر أسهل، رغم أنه "underdoxed":

إذا كنت بحاجة إلى تعليمات معالجة المستوى الأعلى، فقم بإنشائها مثل هذا:

from lxml import etree

root = etree.Element("anytagname")
root.addprevious(etree.ProcessingInstruction("anypi", "anypicontent"))

ستبدو الوثيقة الناتجة مثل هذا:

<?anypi anypicontent?>
<anytagname />

بالتأكيد يجب عليهم إضافة هذا إلى الأسئلة الشائعة لأن IMO إنها ميزة أخرى تحدد هذا API الرائع.

نعم، لا أعتقد أنه ممكن، آسف. يوفر ElementTree واجهة أبسط مع معالجة XML المركزة (غير المسمدة) من العناصر من DOM، ولكن سعر ذلك هو أنه لا يدعم Infoset XML بالكامل.

لا توجد طريقة واضحة لتمثيل المحتوى الذي يعيش خارج عنصر الجذر (التعليقات، PIS، DOCTYPE وإعلان XML)، ويتم التخلص منها أيضا في وقت التحليل. (جانبا: يبدو أن هذا يتضمن أي سمات افتراضية محددة في المجموعة الفرعية الداخلية DTD الداخلية، مما يجعل ElemerTree يتحدث بصرامة معالج XML غير متوافق.)

ربما يمكنك أن تعمل من حولها عن طريق الفئة الفرعية أو تصحيح القرد من تطبيق Python الأصلي Elementtree write() طريقة للاتصال _write على PIs الإضافي الخاص بك قبل _write _root, ، ولكن قد يكون هشا قليلا.

إذا كنت بحاجة إلى دعم لمعلومات XML كاملة، فربما أفضل عصا مع دوم.

أنا لا أعرف الكثير عن elertree. ولكن من الممكن أن تكون قادرا على حل مشكلتك باستخدام مكتبة كتبت تسمى "XE".

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

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

نلقي نظرة وشاهد ما إذا كان يبدو مفيدا.

http://home.avvanta.com/~steveha/xe.html.

إليك مثال على استخدامه:

import xe
doc = xe.XMLDoc()

prefs = xe.NestElement("prefs")
prefs.user_name = xe.TextElement("user_name")
prefs.paper = xe.NestElement("paper")
prefs.paper.width = xe.IntElement("width")
prefs.paper.height = xe.IntElement("height")

doc.root_element = prefs


prefs.user_name = "John Doe"
prefs.paper.width = 8
prefs.paper.height = 10

c = xe.Comment("this is a comment")
doc.top.append(c)

إذا ركضت الرمز أعلاه ثم ركض print doc هنا هو ما سوف تحصل عليه:

<?xml version="1.0" encoding="utf-8"?>
<!-- this is a comment -->
<prefs>
    <user_name>John Doe</user_name>
    <paper>
        <width>8</width>
        <height>10</height>
    </paper>
</prefs>

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

حظا سعيدا مع المشروع الخاص بك.

f = open('D:\Python\XML\test.xml', 'r+')
old = f.read()
f.seek(44,0)      #place cursor after xml declaration
f.write('<?xml-stylesheet type="text/xsl" href="C:\Stylesheets\expand.xsl"?>'+ old[44:])

كنت أواجه نفس المشكلة وتوصلت إلى هذا الحل الخام بعد الفشل في إدراج PI في ملف .xml بشكل صحيح حتى بعد استخدام أحد أساليب العناصر في حالتي root.insert (0, PI) ومحاولة طرق متعددة لقطع ولصق PI المدرج إلى الموقع الصحيح فقط للعثور على البيانات المراد حذفها من مواقع غير متوقعة.

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