جافا ناقلات مجال (عضو) المجمع لا تخزين الأبقار!

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

  •  04-07-2019
  •  | 
  •  

سؤال

تحرير:هذا الرمز هو بخير.وجدت المنطق خلل في مكان ما لا يوجد في بلدي البرمجية الزائفة.لقد كان إلقاء اللوم على عدم وجود جافا الخبرة.

في البرمجية الزائفة أدناه, أنا أحاول تحليل XML مبين.مثال ساذج ربما ولكن كان رمز كبير جدا/محددة لأي شخص الحصول على أي قيمة حقيقية من رؤيتها و التعلم من إجابات نشرها.لذلك هذا هو أكثر تسلية ونأمل أن الآخرين يمكن أن تتعلم من الجواب وكذلك لي.

أنا جديدة على جافا ولكن من ذوي الخبرة C++ مبرمج مما يجعلني اصدق ان المشكلة تكمن في فهم لغة جافا.

المشكلة:عندما محلل التشطيبات ، ناقلات هو الكامل من غير مهيأ الأبقار.إنشاء ناقلات الأبقار مع الافتراضي القدرات (التي يجب أن لا تأثير إنه "حجم" إذا كان أي شيء مثل C++ المحكمة ناقلات).عند طباعة محتويات البقرة ناقلات بعد تحليل, أنه يعطي الحق في الحجم من ناقلات ولكن كل القيم تظهر أبدا أن تم تحديدها.

معلومات:لقد فعلت بنجاح هذا مع موزعي أن لا يكون ناقلات الحقول ولكن في هذه الحالة أود أن استخدام ناقلات تتراكم البقرة خصائص.

MoreInfo:لا أستطيع استخدام الأدوية (ناقلات< البقرة >) لذا يرجى لا وجهة لي هناك.:)

شكرا مقدما.

<pluralcow>
        <cow>
            <color>black</color>
            <age>1</age>
        </cow>
        <cow>
            <color>brown</color>
            <age>2</age>
        </cow>
        <cow>
            <color>blue</color>
            <age>3</age>
        </cow>
</pluralcow>

public class Handler extends DefaultHandler{
    // vector to store all the cow knowledge
    private Vector  m_CowVec;

    // temp variable to store cow knowledge until
    // we're ready to add it to the vector
    private Cow     m_WorkingCow;

    // flags to indicate when to look at char data
    private boolean m_bColor;
    private boolean m_bAge;

    public void startElement(...tag...)
    {
        if(tag == pluralcow){   // rule: there is only 1 pluralcow tag in the doc
                // I happen to magically know how many cows there are here.             
                m_CowVec = new Vector(numcows);
        }else if(tag == cow ){  // rule: multiple cow tags exist
            m_WorkingCow = new Cow();
        }else if(tag == color){ // rule: single color within cow
            m_bColor = true;
        }else if(tag == age){   // rule: single age within cow
            m_bAge = true;
        }
    }

    public void characters(...chars...)
    {
        if(m_bColor){
            m_WorkingCow.setColor(chars);   
        }else if(m_bAge){
            m_WorkingCow.setAge(chars);
        }
    }

    public void endElement(...tag...)
    {
        if(tag == pluralcow){
            // that's all the cows
        }else if(tag == cow ){
            m_CowVec.addElement(m_WorkingCow);      
        }else if(tag == color){
            m_bColor = false;
        }else if(tag == age){
            m_bAge = false;
        }
    }
}
هل كانت مفيدة؟

المحلول

رمز تبدو على ما يرام بالنسبة لي.أقول تعيين نقاط إيقاف في بداية كل وظيفة ووتش في مصحح الأخطاء أو إضافة بعض طباعة البيانات.حدسي يقول لي أن إما characters() يتم استدعاء أو setColor() و setAge() لا تعمل بشكل صحيح, ولكن هذا مجرد تخمين.

نصائح أخرى

عندما تقول أن الأبقار غير مهيأ ، هي سلسلة خصائص تهيئة فارغة?أو فارغة السلاسل ؟

أعرف أنك ذكرت أن هذا هو الزائفة رمز, ولكن أنا فقط أردت أن أشير إلى بعض المشاكل المحتملة:

public void startElement(...tag...)
    {
        if(tag == pluralcow){   // rule: there is only 1 pluralcow tag in the doc
                // I happen to magically know how many cows there are here.                     
                m_CowVec = new Vector(numcows);
        }else if(tag == cow ){  // rule: multiple cow tags exist
                m_WorkingCow = new Cow();
        }else if(tag == color){ // rule: single color within cow
                m_bColor = true;
        }else if(tag == age){   // rule: single age within cow
                m_bAge = true;
        }
    }

كنت حقا ينبغي أن يكون استخدام الوسم.يساوي(...) بدلا من العلامة == ...هنا

public void characters(...chars...)
{
    if(m_bColor){
            m_WorkingCow.setColor(chars);   
    }else if(m_bAge){
            m_WorkingCow.setAge(chars);
    }
}

أفترض أنك على بينة من هذا ، ولكن هذه الأساليب يسمى فعلا مع شخصية العازلة مع بداية ونهاية الفهارس.

نلاحظ أيضا أن الشخصيات(...) يمكن أن يطلق عليه عدة مرات واحد كتلة النص ، والعودة قطع صغيرة في كل مكالمة:http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/ContentHandler.html#characters(char[],%20int,%20int)

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

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

أخيرا, كما ذكر آخرون ، لو انها فكرة جيدة للنظر في XML التنظيم مكتبة (على سبيل المثال ، JAXB ، الخروع ، JIBX, XMLBeans, XStream على سبيل المثال لا الحصر).

يجب أن أقول أنني لست مروحة كبيرة من هذا التصميم.ولكن هل أنت متأكد من أن الأحرف الخاصة بك من أي وقت مضى يسمى ؟ (ربما بضعة النظام.الرافضة من شأنه أن يساعد).إذا لم يسمى, كنت في نهاية المطاف مع غير مهيأ البقرة.

أيضا, أنا لن محاولة تنفيذ XML محلل نفسي مثل هذا منذ عليك أن تكون أكثر قوة ضد التحقق من صحة القضايا.

يمكنك استخدام ساكس أو DOM4J ، أو حتى أفضل ، استخدام Apache هاضم.

أيضا, إذا كان لدي مخطط وسوف تستخدم JaxB أو آخر رمز مولد لتسريع تطوير واجهة XML البرمجية.رمز مولدات تخفي الكثير من تعقيد العمل مباشرة مع ساكس أو DOM4J.

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