0

こんにちは、xmlPullParser に問題があります。少し変更を加えて、Google開発者のチュートリアルに従おうとしています。生のリソース ファイルから xml ファイルを取得しています。ファイルはemployee.xmlと呼ばれます

そして、それは以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<employees>
<employee>
    <id>1</id>
    <firstName>John</firstName>
    <lastName>Doe</lastName>
    <title>CEO</title>
    <city>San Francisco, CA</city>
    <managerId>0</managerId>
    <department>Corporate</department>
    <officePhone>123-456-0001</officePhone>
    <mobilePhone>987-654-1234</mobilePhone>
    <email>John@mail.com</email>
    <picture>placeholder.jpg</picture>
</employee>
<employee>
    <id>2</id>
    <firstName>Barack</firstName>
    <lastName>Obama</lastName>
    <title>President</title>
    <city>Washington DC</city>
    <department>Corporate</department>
    <managerId>0</managerId>
    <officePhone>123-456-0002</officePhone>
    <mobilePhone>781-000-0002</mobilePhone>
    <email>Barack@mail.com</email>
    <picture>barack_obama.jpg</picture>
</employee>
<employee>
    <id>3</id>
    <firstName>Joe</firstName>
    <lastName>Biden</lastName>
    <title>VP</title>
    <city>Washington DC</city>
    <managerId>2</managerId>
    <department>Corporate</department>
    <officePhone>123-456-0003</officePhone>
    <mobilePhone>987-654-1234</mobilePhone>
    <email>Joe@mail.com</email>
    <picture>joe_biden.jpg</picture>
</employee>
<employee>
    <id>4</id>
    <firstName>Hillary</firstName>
    <lastName>Clinton</lastName>
    <title>Secretary of State</title>
    <city>Washington DC</city>
    <managerId>2</managerId>
    <department>Corporate</department>
    <officePhone>123-456-0004</officePhone>
    <mobilePhone>987-654-1234</mobilePhone>
    <email>Hillary@mail.com</email>
    <picture>hillary_clinton.jpg</picture>
</employee>
</employees> 

しかし、コードでそれをパスしようとすると、例外が発生します。以下は、メイン アクティビティから呼び出すこの xml ファイルを解析するためのコードです。

   public List<Employee> parse(Context cont) throws XmlPullParserException, IOException
{
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        parser = factory.newPullParser();
        InputStream stream = cont.getResources().openRawResource(R.raw.employee);
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(stream, null);
        parser.next();
        return readFeed(parser);
}


private List<Employee> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException
{
    employeelist = new ArrayList<>();
    Log.d("current tag:    ", parser.getName());
    Log.d("TAG", "The event type is: " + parser.getEventType());
    parser.require(XmlPullParser.START_TAG, parser.getName().toString(), "employees");

    Log.d("current tag : ", parser.getName());


    while(parser.next() != XmlPullParser.END_TAG)
    {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }


        String name = parser.getName();

        if(name.equals("employee"))
        {
            employeelist.add(readEntry(parser));
        }
        else
        {
            //skip unwanted entries!!
            skip(parser);
        }
    }

    return employeelist;
}

readFeed() メソッドで "parser.require()" を呼び出すと、xmlpullparsereexception がスローされます。正しい「従業員」タグを見つけているように見えるので、その理由はわかりません!! readFeed が呼び出される前に parser.next() を呼び出すように!! ここにスタックトレースがあります。

11-18 08:37:51.476 4660-4676/? D/current tag:: employees
11-18 08:37:51.476 4660-4676/? D/TAG: The event type is: 2
11-18 08:37:51.477 4660-4676/? W/System.err:     org.xmlpull.v1.XmlPullParserException: expected: START_TAG {employees}employees (position:START_TAG <employees>@2:12 in java.io.InputStreamReader@41f7ff40) 
11-18 08:37:51.477 4660-4676/? W/System.err:     at org.kxml2.io.KXmlParser.require(KXmlParser.java:2056)
11-18 08:37:51.477 4660-4676/? W/System.err:     at com.example.eoin_a.xmlparserexample.EmployeeXmlParser.readFeed(EmployeeXmlParser.java:57)
11-18 08:37:51.477 4660-4676/? W/System.err:     at com.example.eoin_a.xmlparserexample.EmployeeXmlParser.parse(EmployeeXmlParser.java:48)
11-18 08:37:51.477 4660-4676/? W/System.err:     at com.example.eoin_a.xmlparserexample.MainActivity$1.run(MainActivity.java:55)
11-18 08:37:51.477 4660-4676/? W/System.err:     at java.lang.Thread.run(Thread.java:841)
11-18 08:37:51.479 4660-4660/? D/AndroidRuntime: Shutting down VM
11-18 08:37:51.479 4660-4660/? W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41670d40)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime: FATAL EXCEPTION: main
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime: Process: com.example.eoin_a.xmlparserexample, PID: 4660
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.eoin_a.xmlparserexample/com.example.eoin_a.xmlparserexample.MainActivity}: java.lang.NullPointerException
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:139)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:136)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5086)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:515)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:  Caused by: java.lang.NullPointerException
11-18 08:37:51.481 4660-4660/? E/AndroidRuntime:     at com.example.eoin_a.xmlparserexample.MainActivity.onCreate(MainActivity.java:38)

異常に見えると思ったので、最初のデバッグログメッセージからも含めました。1 ではなく 2 つのコロンを出力します。理由がわかりません!! 誰かが例外を理解するのを手伝ってくれたら、それは素晴らしいことです。現時点では、以下の例外またはその原因がわかりません。ありがとう!

  org.xmlpull.v1.XmlPullParserException: expected: START_TAG {employees}employees (position:START_TAG <employees>@2:12 in java.io.InputStreamReader@41f7ff40) 
4

1 に答える 1

1

これは parser.require() ドキュメントへのリンクです。

public abstract void require (int type, String namespace, String name)

ここの真ん中のものは、あなたの問題を引き起こしていると私が思うものです。parser.require正しいタグ タイプ、正しい名前空間、正しいタグ名を探しています。これらのいずれかが一致しない場合、例外がスローされます。

あなたの場合、中央の引数では、 getName を使用して現在のタグ (「employees」) の名前を取得し、 parser.require() にそれがnamespaceと一致するかどうかを確認します。名前空間はタグ名とは別のものであるため、例外がスローされます。

getName使用するときに自分自身を使用する必要はありませんparser.require()。期待する名前を渡すだけで済みます。

ドキュメントによると、「null は任意の名前空間と任意の名前に一致します」。開始タグを取得したことを確認する場合は、名前空間引数として<employees>使用して名前空間部分を無視できます。null

    parser.require(XmlPullParser.START_TAG, null, "employees");

これは、それが開始タグであり、タグ名が「employees」であることを確認します。

于 2015-11-17T21:25:45.340 に答える