هل من الضروري أن أستخدم المكتبات لمعالجة XML؟

StackOverflow https://stackoverflow.com/questions/24866

  •  09-06-2019
  •  | 
  •  

سؤال

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

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

المحلول

انها ليست ضرورية، ولكن من المستحسن.ومع ذلك، إذا كان التلاعب بالسلاسل يناسبك، فافعله!هناك الكثير من الحالات التي يمكن فيها إنشاء نص XML صغير أو بسيط يدويًا بأمان.

فقط كن على علم بأن إنشاء نص XML أصعب مما يبدو.إليك بعض المعايير التي سأضعها في الاعتبار:

  • أولاً:كم ثمن يتحكم هل لديك المعلومات التي تدخل في ملف XML؟

كلما قلت قدرتك على التحكم في البيانات المصدر، زادت احتمالية مواجهة المشاكل، وأصبحت المكتبة أكثر فائدة.على سبيل المثال:(أ) هل تستطيع يضمن أن أسماء العناصر لن تحتوي أبدًا على حرف غير قانوني في الاسم؟(ب) ماذا عن علامات الاقتباس في محتوى السمة؟هل يمكن أن تحدث، وهل تتعامل معها؟(ج) هل تحتوي البيانات على أي شيء قد يحتاج إلى ترميزه على أنه ملف كيان (مثل أقل مما يحتاج غالبًا إلى الإخراج كـ <);هل تفعل ذلك بشكل صحيح؟

  • ثانياً: قابلية الصيانة:هو الكود الذي يبني XML سهل الفهم من قبل شخص آخر?

ربما لا تريد أن تظل عالقًا في الكود مدى الحياة.لقد عملت مع كود C++ المستعمل الذي يبني XML يدويًا ويمكن أن يكون غامضًا بشكل مدهش.بالطبع، إذا كان هذا مشروعًا شخصيًا لك، فلا داعي للقلق بشأن "الآخرين":استبدل عبارة "في عام" بكلمة "أخرى" أعلاه.

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

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

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

حظ سعيد.

نصائح أخرى

XML صعب.يعد التحليل بنفسك فكرة سيئة، بل إن إنشاء المحتوى بنفسك فكرة أسوأ.ألق نظرة على مواصفات Xml 1.1.

يجب عليك التعامل مع أشياء مثل التشفير المناسب، وترميز السمات (على سبيل المثال، إنتاج ملف xml غير صالح)، وهروب CDATA المناسب، وترميز UTF، وكيانات DTD المخصصة، وذلك دون إدخال مساحات أسماء xml المختلطة مع مساحة الاسم الافتراضية/الفارغة، وسمات مساحة الاسم ، إلخ.

تعلم مجموعة الأدوات، هناك الكثير منها متاح.

أعتقد أن معالجة السلسلة المخصصة أمر جيد، ولكن عليك أن تضع شيئين في الاعتبار:

  1. الكود الخاص بك ليس ناضجًا مثل المكتبة.خصص وقتًا في خطتك للتعامل مع الأخطاء التي تظهر.
  2. ربما لن يتوسع أسلوبك مثل مكتبة الطرف الثالث عندما يبدأ ملف XML في النمو (سواء من حيث الأداء أو سهولة الاستخدام).

أعرف قاعدة تعليمات برمجية تستخدم معالجة سلسلة مخصصة لمخرجات XML (ومكتبة خارجية للإدخال).كان الأمر جيدًا في البداية ولكنه أصبح مشكلة حقيقية بعد فترة.

نعم استخدم المكتبة

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

من خلال عدم استخدام المكتبة، فإنك تخاطر بإنشاء أو تحليل بيانات غير جيدة التكوين، والتي عاجلاً أم آجلاً سوف يحدث.لنفس السبب document.write غير مسموح به في XHTML، فيجب ألا تكتب ترميز XML كسلسلة.

نعم.

ليس من المنطقي تخطي الأداة الأساسية:حتى كتابة ملف xml ليس أمرًا تافهًا حيث يتعين عليك الهروب من علامات العطف وlts، ناهيك عن روابط مساحة الاسم (إذا لزم الأمر).وفي النهاية، يمكن للمكتبات بشكل عام قراءة وكتابة ملف XML ليس فقط بشكل أكثر موثوقية ولكن بشكل أكثر كفاءة (خاصة.لذلك بالنسبة لجافا).

ولكن ربما كنت تبحث عن أدوات خاطئة، إذا كانت تبدو معقدة للغاية.يعد ربط البيانات باستخدام JAXB أو XStream أمرًا بسيطًا؛ولكن بالنسبة لمخرجات XML البسيطة والمباشرة، فأنا أختار ستاكسميت.يمكنه في الواقع تبسيط المهمة بعدة طرق (يغلق علامات البداية تلقائيًا، ويكتب إعلانات مساحة الاسم إذا لزم الأمر، وما إلى ذلك).

لا - إذا كان بإمكانك تحليلها بنفسك (كما تفعل)، وسوف تتناسب مع احتياجاتك، فلن تحتاج إلى أي مكتبة.

فقط تأكد من تلبية احتياجاتك المستقبلية - من الأفضل أن يتم إنشاء ملفات XML المعقدة باستخدام المكتبات - والتي يأتي بعضها بنكهات بسيطة جدًا أيضًا.

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

ليس عليك استخدام المكتبة لتحليل XML، ولكن راجع هذا السؤال
ما هي الاعتبارات التي ينبغي اتخاذها قبل إعادة اختراع العجلة؟
قبل البدء في كتابة التعليمات البرمجية الخاصة بك لتحليل/إنشاء ملف XML.

لا - خاصة بالنسبة للتوليد (سأكون أقل ميلاً إلى التحليل لأن نص الإدخال يمكن أن يفاجئك دائمًا).أعتقد أنه أمر جيد - ولكن كن مستعدًا للانتقال إلى المكتبة إذا وجدت نفسك تقضي أكثر من بضع دقائق في صيانة الكود الخاص بك.

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

في الصفحة الأولى يجد جوجل من إسبانيا (مثال XML الاسباني):

public String DOM2String(Document doc)
{
    TransformerFactory transformerFactory =TransformerFactory.newInstance();
    Transformer transformer = null;
    try{
        transformer = transformerFactory.newTransformer();
    }catch (javax.xml.transform.TransformerConfigurationException error){
        coderror=123;
        msgerror=error.getMessage();
        return null;
    }

    Source source = new DOMSource(doc);

    StringWriter writer = new StringWriter();
    Result result = new StreamResult(writer);
    try{
        transformer.transform(source,result);
    }catch (javax.xml.transform.TransformerException error){
        coderror=123;
        msgerror=error.getMessage();
        return null;
    }

    String s = writer.toString();
    return s;
}

public Document string2DOM(String s)
{
    Document tmpX=null;
    DocumentBuilder builder = null;
    try{
        builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    }catch(javax.xml.parsers.ParserConfigurationException error){
        coderror=10;
        msgerror="Error crando factory String2DOM "+error.getMessage();
        return null;
    }
    try{
        tmpX=builder.parse(new ByteArrayInputStream(s.getBytes()));
    }catch(org.xml.sax.SAXException error){
        coderror=10;
        msgerror="Error parseo SAX String2DOM "+error.getMessage();
        return null;
    }catch(IOException error){
        coderror=10;
        msgerror="Error generando Bytes String2DOM "+error.getMessage();
        return null;
    }
    return tmpX;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top