سؤال

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

يؤدي مسار StringBuilder ذو التقنية المنخفضة إلى كود هش وعربات التي تجرها الدواب (على الأقل بالنسبة لي!).

واجهة برمجة التطبيقات مثل جاكسب أو JDOM يؤدي إلى تعليمات برمجية أكثر قوة، ولكنها مطولة جدًا.

رائع لديه أنيقة MarkupBuilder:

def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.records() {
  car(name:'HSV Maloo', make:'Holden', year:2006) {
    country('Australia')
    record(type:'speed', 'Production Pickup Truck with speed of 271kph')
  }
  car(name:'P50', make:'Peel', year:1962) {
    country('Isle of Man')
    record(type:'size', 'Smallest Street-Legal Car at 99cm wide and 59 kg')
  }
}

لغات أخرى (على سبيل المثال. روبي) لديها أفضل منها، على الرغم من أنني أرغب في البقاء مع جافا النقية.يبدو أن هناك بعض أدوات إنشاء XML الجديدة لـ Java، مثل معرف com لهذا التطبيق هو com.practicxml وجيمس مورتي com.xmlbuilder.

ما هي الأساليب الأكثر أناقة لإنشاء مستندات XML في Java؟

ملخص:

اقترح جون دو dom4j و jdom.

أوصى CurtainDog باستخدام JAXB على أية حال، وأخبرني jherico أن هذا كان اقتراحًا ذا صلة:يمكنك بعد ذلك استخدام Dozer للتخطيط بين JavaBeans الحالي وJAXB JavaBeans.

يوصي ثاجي جيبكس واتفقت مع CurtainDog وjherico على أن تقنيات الربط عملية بالفعل.

يوصي StaxMan ستاكسميت.

من بين الأشياء التي نظرت إليها، يبدو أنpracticxml وXmlbuilder الخاص بجيمس مورتي هما أكثر أدوات الإنشاء إيجازًا، على الرغم من أنهما حديثان إلى حد ما.يبدو أن تقنيات الربط مثل JAXB توفر أمانًا/أتمتة إضافية.من الاختيارات السائدة، dom4j يبدو لائقًا، على الرغم من أنه لا يزال مطولًا نوعًا ما.إنه يوفر "واجهة سلسة" (يرجع المتحولون مرجعًا إلى الكائن المتحور حتى يمكن ربطهم معًا)، وهو ما يعجبني:

public Document createDocument() {
    Document document = DocumentHelper.createDocument();
    Element root = document.addElement( "root" );
    Element author2 = root.addElement( "author" )
      .addAttribute( "name", "Toby" )
      .addAttribute( "location", "Germany" )
      .addText( "Tobias Rademacher" );
    Element author1 = root.addElement( "author" )
      .addAttribute( "name", "James" )
      .addAttribute( "location", "UK" )
      .addText( "James Strachan" );
    return document;
}

للإيجاز، يمكنك تغليف واجهة رفيعة فوق واجهة برمجة التطبيقات هذه لتوفير مرادفات مقتضبة لبعض هذه الطرق (على سبيل المثال، attr() بدلاً من addAttribute()).

شكرا لكم جميعا!

ملاحظة.:عمل ستيفان شميدت على لغة جافا MarkupBuilder, على الرغم من أنه يبدو أنه لم ينشره.

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

المحلول

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

Element.addElement("x").setAttribute("x", "y").xxxxx;

نصائح أخرى

نلقي نظرة على XOM.إنها سريعة وبسيطة وصحيحة وليست مطولة.

لماذا لا تستخدم JAXB على أي حال ..ثم تصبح المشكلة كائنًا بسيطًا جدًا لتعيين الكائنات وتتجنب XML تمامًا.

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

مقابل ما يستحق، فهو يدعم أيضًا الأسلوب بطلاقة (اعتبارًا من 2.0.x)، لأنه غالبًا ما يكون منطقيًا.ربما تكون الفائدة الرئيسية من حلول ربط البيانات الكاملة (والنموذج الشجري) هي انخفاض استخدام الذاكرة؛يتم الاحتفاظ بحالة قليلة جدًا، ويتم إرسال كل المخرجات إلى الوجهة في أسرع وقت ممكن.

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

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

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

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