java - موضوع - مشروع برمجة الروبوت



خطأ ديسيرياليزينغ كائن شمل باستخدام إطار سيمبلكسمل في الروبوت فقط (0)

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

أحاول تحليل جمدكت مع سيمبلكسمل، ولكن أنا ضرب أخطاء غريبة حقا. الشيء الغريب الآخر هو أن الأخطاء تحدث فقط عندما أنا التصحيح على الروبوت (سك 23، الإصدار 6.0.1)، أبدا محليا على مربع بلدي (كاختبار وحدة). هناك خطأان أحصل عليهما حاليا:

خطأ 1

org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT\[email protected]:1 in [email protected])

أعرف ما يسبب هذا الخطأ هو التعليق بين إعلان دتد والعنصر الجذر والخط الجديد الموجود هناك. فإنه يذهب بعيدا عند إزالتها.

<!ENTITY joc "jocular, humorous term">
<!ENTITY anat "anatomical term">
]>
<!-- JMdict created: 2016-04-26 -->
<JMdict>
<entry>

لكن لماذا يحدث هذا؟ كيف يمكنني إلغاء هذا الخطأ؟ والأهم من ذلك، لماذا يحدث ذلك فقط عندما تشغيله في الروبوت؟ (أنه يدير غرامة تماما في بلدي اختبار وحدة)

خطأ 2

04-27 23:58:13.038 9527-9527/ca.fuwafuwa.kaku W/System.err: org.xmlpull.v1.XmlPullParserException: unresolved: &n; (position:ENTITY_REF [email protected]:9 in [email protected])

ربما يكون الخطأ الذي يسبب هذا:

<entry>
    <ent_seq>1000000</ent_seq>
    <r_ele>
        <reb></reb>
    </r_ele>
    <r_ele>
        <reb>くりかえし</reb>
    </r_ele>
    <sense>
        <pos>&n;</pos>    <------------------------------------ THIS GUY
        <gloss>repetition mark in katakana</gloss>
        <gloss xml:lang="ita">simbolo di ripetizione in katakana</gloss>
    </sense>
</entry>

ما لم يتم تعريف هذا بالتأكيد في دتد:

<!ENTITY n "noun (common) (futsuumeishi)">

الاشياء محاولة

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

public class ExampleUnitTest {

    @BeforeClass
    public static void ClassSetup(){
        // Needed because there's a 64000 default limit in the JDK
        // I didn't see this limit on Android for some reason
        System.setProperty("jdk.xml.entityExpansionLimit", "0");
    }

    @Test
    public void wtfXmlSrsly() throws Exception {
        Serializer serializer = new Persister();
        File file = new File("D:\\Android\\JMDictOriginal.xml");
        JmDict dict = serializer.read(JmDict.class, file, false);
    }
}

وإليك الإصدار الروبوت فشل المجيد:

public void parseDict() throws Exception{

    Log.d(TAG, "INITIALIZING DICTIONARY");

    long startTime = System.currentTimeMillis();

    Serializer serializer = new Persister();
    String fileLoc = mContext.getExternalFilesDir(null).getAbsolutePath();
    File file = new File(fileLoc, "JMDict.xml");

    Log.d(TAG, file.getAbsolutePath());

    JmDict dict = serializer.read(JmDict.class, file, false);

    Log.d(TAG, String.format("FINISHED, TOOK %d", System.currentTimeMillis() - startTime));
}

بقدر ما أستطيع أن أقول، تلك هي في الأساس تفعل الشيء نفسه.

سيمبلكسمل ديسيرياليزاشيون كائنات

@Root(name="JMdict")
public class JmDict {
    @ElementList(entry = "entry", inline = true)
    List<JmEntry> entry;
}

@Root(name="entry")
public class JmEntry {
    @Element(name = "ent_seq")
    private String ent_seq;
    @ElementList(entry = "k_ele", inline = true, required = false)
    private List<JmKEle> k_ele;
    @ElementList(entry = "r_ele", inline = true)
    private List<JmREle> r_ele;
    @Element(name = "info", required = false)
    private JmInfo info;
    @ElementList(entry = "sense", inline = true)
    private List<JmSense> sense;
}

@Root(name = "k_ele")
public class JmKEle {
    @Element(name = "keb")
    private String keb;
    @ElementList(entry = "ke_inf", inline = true, required = false)
    private List<String> ke_inf;
    @ElementList(entry = "ke_pri", inline = true, required = false)
    private List<String> ke_pri;
}

@Root(name = "r_ele")
public class JmREle {
    @Element(name = "reb")
    private String reb;
    @Element(name = "re_nokanji", required = false)
    private String re_nokanji;
    @ElementList(entry = "re_restr", inline = true, required = false)
    private List<String> re_restr;
    @ElementList(entry = "re_inf", inline = true, required = false)
    private List<String> re_inf;
    @ElementList(entry = "re_pri", inline = true, required = false)
    private List<String> re_pri;
}

@Root(name = "info")
public class JmInfo {
    @ElementList(entry = "links", inline = true, required = false)
    private List<Links> links;
    @ElementList(entry = "bibl", inline = true, required = false)
    private List<Bibl> bibl;
    @ElementList(entry = "etym", inline = true, required = false)
    private List<String> etym;
    @ElementList(entry = "audit", inline = true, required = false)
    private List<Audit> audit;
}

@Root(name = "links")
public class Links {
    @Element(name = "link_tag")
    private String link_tag;
    @Element(name = "link_desc")
    private String link_desc;
    @Element(name = "link_uri")
    private String link_uri;
}

@Root(name = "bibl")
public class Bibl {
    @Element(name = "bib_tag", required = false)
    private String bib_tag;
    @Element(name = "bib_txt", required = false)
    private String bib_txt;
}

@Root(name = "audit")
public class Audit {
    @Element(name = "upd_date")
    private String upd_date;
    @Element(name = "upd_detl")
    private String upd_detl;
}

@Root(name = "sense")
public class JmSense {
    @ElementList(entry = "stagk", inline = true, required = false)
    private List<String> stagk;
    @ElementList(entry = "stagr", inline = true, required = false)
    private List<String> stagr;
    @ElementList(entry = "pos", inline = true, required = false)
    private List<String> pos;
    @ElementList(entry = "xref", inline = true, required = false)
    private List<String> xref;
    @ElementList(entry = "ant", inline = true, required = false)
    private List<String> ant;
    @ElementList(entry = "field", inline = true, required = false)
    private List<String> field;
    @ElementList(entry = "misc", inline = true, required = false)
    private List<String> misc;
    @ElementList(entry = "s_inf", inline = true, required = false)
    private List<String> s_inf;
    @ElementList(entry = "lsource", inline = true, required = false)
    private List<String> lsource;
    @ElementList(entry = "dial", inline = true, required = false)
    private List<String> dial;
    @ElementList(entry = "gloss", inline = true, required = false)
    private List<String> gloss;
    @ElementList(entry = "example", inline = true, required = false)
    private List<String> example;
}

البدائل

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

<!ELEMENT gloss (#PCDATA | pri)*>
<!ELEMENT pri (#PCDATA)>
<!-- Above breaks down into: -->

<gloss>GLOSS TEXT</gloss>
<!-- or -->
<gloss><pri>PRI TEXT</pri></gloss>

اعتقدت تحليل شمل كان مشكلة حلها الآن. لم أكن أتوقع أن تكون عالقة على تحليل شمل لمدة 3 أيام على التوالي: /

تحديث

حسنا، أنا متأكد تقريبا شيء مكسور على الروبوت الآن، وأنه لا يمكن تحليل دتد الكيانات أو شيء من هذا. قرأت هنا أن لديك لاستبعاد بعض التبعيات التي هناك بشكل افتراضي في الروبوت - ربما تم تغيير التنفيذ هناك بطريقة أو بأخرى؟

لم أكن قادرا حتى على تحليل هذا ملف شمل بسيط حقا مع إعلان إنتيتي:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XmlTest [
<!ELEMENT XmlTest (sometest, atest*)>
<!ELEMENT sometest (#PCDATA) >
<!ELEMENT atest (#PCDATA) >
<!ENTITY noun "noun">
]><XmlTest>
    <sometest>sometest</sometest>
    <atest>test1</atest>
    <atest>&noun;</atest>
</XmlTest>

وأسفر ذلك عن:

org.xmlpull.v1.XmlPullParserException: unresolved: &noun; (position:ENTITY_REF [email protected]:18 in [email protected])





simple-framework