قسّم ملفات XML الكبيرة بسرعة باستخدام برنامج بايثون آمن

لتقسيم ملف XML كبير بسرعة، قسّمه عند السجلات المتكررة الكاملة بدلاً من اقتطاع أجزاء منه. يستخدم المثال أدناه مكتبة بايثون القياسية لمعالجة المدخلات وكتابة مستندات XML منفصلة بنفس العنصر الجذر وسماته. وهو مصمم لبنية شائعة مثل <script> <records><record>...</record><record>...</record></records>، حيث يمثل كل عنصر فرعي مباشر للعنصر الجذر سجلاً مستقلاً.

يعرض محرر XML جذر السجلات مع عناصر سجل متكررة وسجل مكبر يحتوي على عناصر فرعية من نوع ID و name و value.
قم بالتقسيم عند سجلات الأبناء المباشرين المتكررة تحت الجذر؛ يمكن أن تؤدي حدود البايت العشوائية إلى كسر ترميز XML.

اختر نقطة تقسيم آمنة

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

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

ماذا عن أداة تقسيم XML / OOXP؟

أشارت المقالة الأصلية إلى برنامج Split That XML. لا تزال صفحة المشروع على موقع SourceForge تصف البرنامج، لكنها تُشير إلى أن آخر تحديث له كان في 27 سبتمبر 2015. تعامل معه كبرنامج قديم: فادعاء التوافق مع نظام Windows القديم لا يُؤكد دعمه للأنظمة الحالية. إذا كان لديك نسخة منه، فاعمل على ملف مُطابق وتحقق من صحة المُخرجات قبل استخدامها.

تقسيم السجلات باستخدام بايثون

يقرأ بايثون المستند xml.etree.ElementTree.iterparse()تدريجيًا، مما يتجنب تحميل شجرة XML بأكملها في الذاكرة دفعة واحدة. يقوم البرنامج النصي أدناه بتجميع العناصر الفرعية المباشرة في دفعات، ثم يكتب كل دفعة داخل نسخة جديدة من الوسم الجذر الأصلي وخصائصه. لا يحتاج هذا البرنامج إلى أي حزمة خارجية. إذا لم يكن بايثون مثبتًا، فاستخدم التنزيلات الرسمية لبايثون لنظام ويندوز ؛ وتصف وثائق ElementTree المحلل المستخدم هنا.

يحتوي مجلد العمل على ملفي input.xml و split_xml.py، مع فتح مصدر XML في محرر نصوص.
احتفظ بالملف الأصلي دون تغيير، واختر مجلد إخراج جديدًا وفارغًا لكل عملية تشغيل.
  1. أنشئ نسخة عمل من ملف XML المصدر. أنشئ مجلد إخراج جديد فارغ، مثل parts.
  2. في محرر نصوص عادي، احفظ ما يلي split_xml.pyفي نفس مجلد العمل الخاص بالنسخة.
from pathlib import Path
import sys
import xml.etree.ElementTree as ET

source = Path(sys.argv[1])
out_dir = Path(sys.argv[2])
records_per_file = int(sys.argv[3]) if len(sys.argv) > 3 else 500

if records_per_file < 1:
    raise SystemExit("records_per_file must be at least 1")
out_dir.mkdir(parents=True, exist_ok=True)
if any(out_dir.glob("part_*.xml")):
    raise SystemExit("Choose a new, empty output folder first")

records = []
part_count = 0
root = None
root_tag = None
root_attrib = {}

def write_part(items, number):
    wrapper = ET.Element(root_tag, root_attrib)
    wrapper.extend(items)
    target = out_dir / f"part_{number:04d}.xml"
    ET.ElementTree(wrapper).write(
        target, encoding="utf-8", xml_declaration=True
    )

depth = 0
for event, elem in ET.iterparse(source, events=("start", "end")):
    if event == "start":
        depth += 1
        if depth == 1:
            root = elem
            root_tag = elem.tag
            root_attrib = dict(elem.attrib)
    else:
        if depth == 2:
            records.append(elem)
            if len(records) == records_per_file:
                part_count += 1
                write_part(records, part_count)
                records.clear()
                root[:] = []
        depth -= 1

if records:
    part_count += 1
    write_part(records, part_count)
if part_count == 0:
    raise SystemExit("No direct-child elements were found under the root")
print(f"Wrote {part_count} files.")

شغّل الأمر

افتح برنامج PowerShell في مجلد العمل وتأكد من توفر Python. الوسيط الأخير هو عدد السجلات لكل جزء؛ القيمة الافتراضية هي 500 إذا لم تقم بتحديدها.

python --version
python split_xml.py input.xml parts 500

في نظام ويندوز المُثبّت باستخدام مُشغّل بايثون، يمكن أن يكون السطر الثاني كالتالي py -3 split_xml.py input.xml parts 500: . يقوم البرنامج النصي بكتابة ملفات مثل part_0001.xmlويُبلغ عن عددها. استخدم مجلد إخراج فارغًا في كل مرة؛ يتوقف البرنامج النصي إذا كانت ملفات الأجزاء المطابقة موجودة بالفعل، حتى لا يخلط التشغيل الجديد مع الملفات المتبقية دون علم المستخدم.

تعرض نافذة Windows PowerShell الأمر الخاص بتقسيم ملف input.xml إلى أجزاء تحتوي كل منها على 500 سجل.
تحدد وسيطة الأمر الثالثة عدد السجلات، وليس الحد الأقصى المضمون لحجم الملف.

تحقق من النتائج قبل الاستيراد

أولاً، قم بتحليل كل جزء مُنشأ لاكتشاف ملفات XML غير الصحيحة. من PowerShell، قم بتشغيل ما يلي:

python -c "import glob, xml.etree.ElementTree as ET; files=glob.glob('parts/*.xml'); [ET.parse(p) for p in files]; print(f'{len(files)} files parsed')"

تأكد من أن العدد المُبلغ عنه ليس صفرًا، وافحص بعض الملفات، وقارن إجمالي عدد السجلات مع المصدر. يُثبت التحليل الناجح فقط أن جزءًا ما سليم البنية ، ولا يُثبت استيفائه لمعايير مخطط XML (XSD) أو تعريف نوع المستند (DTD) أو قواعد العمل أو متطلبات التطبيق الذي سيستخدمه. عندما يكون ذلك مهمًا، تحقق من صحة كل جزء باستخدام المخطط أو أداة التحقق التي يستخدمها النظام المستهدف. تشرح موارد W3C XML Schema الدور المنفصل لقيود المخطط.

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

الحدود والحلول السريعة

  • لا يزال أحد الأجزاء كبيرًا جدًا: قلل عدد السجلات، على سبيل المثال من 500 إلى 100. قد يتسبب سجل واحد كبير في تجاوز أحد الأجزاء لحجمك المستهدف؛ لا يفرض هذا البرنامج النصي حدًا أقصى صارمًا للميغابايت.
  • تفشل الأجزاء في التحقق من صحة المخطط: تحقق من أن حدود السجل المختارة تتطابق مع البنية والترتيب المطلوبين في المخطط. يمكن أن يحافظ التقسيم على التداخل السليم دون الحفاظ على صحة المستند على مستوى المستند.
  • تم تغيير البادئات أو التنسيق: قد يقوم ElementTree بتسلسل بادئات مساحات الأسماء بشكل مختلف، كما يقوم بتطبيع تمثيل XML. قارن القيم المُحللة وسلوك التطبيق بدلاً من توقع نسخ متطابقة بايتًا ببايت.
  • يستخدم المصدر تعريفات أنواع المستند (DTDs) والتعليقات وتعليمات المعالجة أو البيانات الوصفية على مستوى الجذر: لا يحافظ هذا البرنامج النصي البسيط على جميع بنيات المستند. استخدم أداة XML تدعم المصطلحات واختبر على نسخة منها.

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

اترك تعليقاً

حوّل الصور إلى لوحات ورسومات ورسوم متحركة باستخدام تطبيق FotoSketcher

حوّل الصور إلى لوحات ورسومات ورسوم متحركة باستخدام تطبيق FotoSketcher

حوّل صورتك إلى لوحة فنية، أو رسم تخطيطي بالقلم الرصاص، أو رسم كاريكاتوري باستخدام برنامج FotoSketcher Studio. تعرّف على كيفية اختيار التأثير، وضبط المعاينة، وحفظ عملك الفني.

تحليل وتحديد ملفات الصوت بالتفصيل باستخدام مُعرّف الصوت

تحليل وتحديد ملفات الصوت بالتفصيل باستخدام مُعرّف الصوت

تعرف على ما يكشفه برنامج Audio Identifier عن معدل البت، والمشفرات، والعلامات، وكيف يعمل سير العمل القديم الخاص به، وما هي الأدوات الحالية التي تفحص الملفات أو تحدد الأغاني.

فهرس صوري: منظم صور مفتوح المصدر لنظام ويندوز

فهرس صوري: منظم صور مفتوح المصدر لنظام ويندوز

برنامج My Photo Index هو برنامج قديم لنظام ويندوز يُستخدم لتصنيف الصور المحلية وتقييمها واستعراضها. راجع ميزاته الموثقة، وحدود توافقه، وبديلًا مُحدّثًا له.

تغيير خصائص الملفات والمجلدات والتواريخ والأوقات باستخدام أداة تغيير الخصائص

تغيير خصائص الملفات والمجلدات والتواريخ والأوقات باستخدام أداة تغيير الخصائص

تعرف على كيفية استخدام برنامج تغيير السمات لتحرير سمات ملفات ويندوز والطوابع الزمنية، وتحديث تواريخ صور JPEG EXIF، ومعاينة التغييرات المجمعة بأمان.

كيفية تعيين خلفية شاشة مختلفة على كل شاشة في نظام التشغيل ويندوز 10

كيفية تعيين خلفية شاشة مختلفة على كل شاشة في نظام التشغيل ويندوز 10

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

pViewer: عارض صور بسيط وقارئ مانغا وقصص مصورة

pViewer: عارض صور بسيط وقارئ مانغا وقصص مصورة

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

NeoDownloader: اضبط المعلمات وقم بتنزيل الصور دفعة واحدة من مواقع الويب

NeoDownloader: اضبط المعلمات وقم بتنزيل الصور دفعة واحدة من مواقع الويب

تعرف على كيفية إنشاء مشروع NeoDownloader، واختيار نطاق الزحف، وتعيين مرشحات الصور والوجهة، ومراجعة عمليات التنزيل المجمعة.

كيفية التبديل إلى خلفية سطح المكتب التالية باستخدام مفتاح اختصار في نظامي التشغيل ويندوز 7 و 8

كيفية التبديل إلى خلفية سطح المكتب التالية باستخدام مفتاح اختصار في نظامي التشغيل ويندوز 7 و 8

قم بإعداد عرض شرائح لنظام التشغيل Windows 7 أو 8، وأنشئ اختصارًا صغيرًا بلغة VBScript، وقم بتعيين مفتاح اختصار لوحة المفاتيح للانتقال إلى خلفية الشاشة التالية.

XnConvert: تطبيق التأثيرات وتحويل تنسيقات الصور دفعة واحدة

XnConvert: تطبيق التأثيرات وتحويل تنسيقات الصور دفعة واحدة

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

تتبع ساعات العمل واستخدام الكمبيوتر باستخدام ManicTime

تتبع ساعات العمل واستخدام الكمبيوتر باستخدام ManicTime

تعرف على كيفية قيام ManicTime بتتبع استخدام التطبيق، ووقت النشاط ووقت الخمول، والمستندات، ثم قم بتحويل سجل نشاطك إلى علامات للمشاريع وجداول زمنية.