هذه مجردة صفحة لمناقشة الأفكار.
الهدف في النهاية الحصول على كائن بأبسط صوره يكون عبارة عن منظومة أو قائمة list بالعقد nodes كل واحدة عبارة عن عنصرين هما المحتوى وهو نص صرف والوسوم وهي قاموس من المفاتيح وقيمها والعنصر الأخير هو العقد الفرعية. مثل هذا الكائن في بايثون يكون بالأنواع المبنية في اللغة نفسها built-in types هكذا
nodes=[ ['this is text body', {'tag1': 'value1', 'tag2': 'value2'}, [ ['this is a text', {'tag1': 'value1'}, []], ['click here', {'href': 'http://www.ojuba.org'}, []], ['this is a text', {'tag1': 'value1'}, []] ] ] ]
من البدائل الموجودة أمامنا هي أن يكون لكل باب صف واحد به خلية فيها المحتويات بهيئة ويكي أو أي هيئة أخرى مثل xml. لكن بصرف النظر عن طريقة التحسين optimization فإن لدينا طريقتين للوسم
استخدام طريقتين للوسم واحد من خلال صيغة الويكي وأخرى من خلال صفوف في جداول قاعدة البيانات يعني
مثلا لو كان هناك عقدة تحمل وسم يدل على رقم الصفحة في المطبوع موجودة في كود ويكي أو xml ثم أردنا القفز لصفحة معينة من خلال استعلام في قاعدة البيانات لن نجدها. (وطبعا السير على كل العقد التي تحتوي xml بحثا عن رقم الصفحة لن يكون مجديا)
على مبدأ أن الحل التوفيقي بين حلين هو الحل الذي يجمع عيوبهما .
في الكثير من الأحيان يكون من الأجدى عدم استخدام وسوم على النص بل استخدام رموز ويكي مثلا عوضا عن عمل وسم للفقرة يمكن استخدام تتابع علامتي سطر جديد كعلامة للفقرة. هذا الأمر يكون مفيدا جدا إن كانت كثرة هذا الوسم ستضيف كمًا كبيرا من الصفوف في قاعدة البيانات بشرط أن تكون هناك أهمية للبحث عن هكذا وسم من ناحية دلالية.
محددات اختيار هذه الرموز
أمثلة على الاستخدام الأمثل لمثل هذه الأشياء
أمثلة قد تكون مفيدة على شكل ويكي ومن الأفضل أن تكون على شكل وسوم (بحاجة لقرار)
يمكن أن يكون الكود المكتوب بهيئة xml على هذه الصيغة العامة
<node tag1="value1" tag2="value2">this is text body <node tag1="value1" tag2="value2">this is text body</node> <node href="http://www.ojuba.org">click here</node> <node tag1="value1" tag2="value2">this is text body</node> </node>
يمكن توليد كود xml من بايثون بهذه الطريقة:
from lxml import etree n=etree.Element("node", tag1="value1", tag2="value2") n.append(etree.Element("node", tag1="value1", tag2="value2")) n.append(etree.Element("node", href="http://www.ojuba.org")) n.append(etree.Element("node", tag1="value1", tag2="value2")) n.attrib['foo']='foobar' print etree.tostring(n,encoding='UTF-8' , pretty_print=True)
للعملية العكسية نعمل
root = etree.XML(s) print root.tag print root.attrib print root.text for i in root: print i.tag print i.attrib print i.text
وليس بالضرورة أن نحوّله إلى كائن من الأنواع المبنيّة في اللغة لأن lxml تدعم كل الخصائص التي نريدها.
يمكن تحويل هذه الصيغة إلى أي صيغة بما فيها التصدير إلى html من خلال XSLT هكذا
xslt_doc = etree.XML(s) # or etree.fromstring(s) or etree.parse(some_file_like) transform = etree.XSLT(xslt_doc) result_tree = transform(doc, param1=value1)
للمزيد انظر
طريقة تحويل نص Yaml إلى كائن
import yaml s="""\ - - 'this is text body' - {'tag1': 'value1', 'tag2': 'value2'} - - - 'this is a text' - {'tag1': 'value1'} - [] - - 'click here' - {'href': 'http://www.ojuba.org'} - [] - - 'this is a text' - {'tag1': 'value1'} - [] """ nodes=yaml.load(s)
للقيام بالعملية العكسية
s=yaml.dump(nodes)
مجموعة جزئية subset من YAML يعني ليس كل YAML يعتبر JSON لكن كل كائن JSON يعتبر YAML
للتحويل من كائن بايثوني إلى JSON
import json nodes=[ ['this is text body', {'tag1': 'value1', 'tag2': 'value2'}, [ ['this is a text', {'tag1': 'value1'}, []], ['click here', {'href': 'http://www.ojuba.org'}, []], ['this is a text', {'tag1': 'value1'}, []] ] ] ] print json.dumps(nodes)
للعملية العكسية
s='''[["this is text body", {"tag1": "value1", "tag2": "value2"}, [["this is a text", {"tag1": "value1"}, []], ["click here", {"href": "http://www.ojuba.org"}, []], ["this is a text", {"tag1": "value1"}, []]]]]''' nodes=json.loads(s)