2015-11-17 2 views
0

Привет, ребята У меня проблема с xmlPullParser. Я стараюсь следовать вместе с учебником для разработчиков Google с небольшими изменениями. Iam reaing xml-файл из файла необработанных ресурсов. файл называется employee.xmlнеприятности разбора локального файла xml с xmlPullParser в android xmlPullParserException

и он выглядит ниже.

<?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>[email protected]</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>[email protected]</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>[email protected]</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>[email protected]</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; 
} 

xmlpullparserexception отбрасывается, когда я называю «parser.require()» в методе readFeed(). Я не уверен, почему, как кажется, найти правильный тег «работники»! как я вызываю parser.next(), прежде чем readFeed вызывается !! вот стоп-трасса.

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 [email protected]) 
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) 

Я включил из первого сообщения журнала отладки также, поскольку я думал, что это выглядит необычно. он выводит 2 двоеточия вместо 1. Я не знаю, почему! Если бы кто-нибудь мог помочь мне с пониманием исключения, которое было бы здорово, поскольку на минуту я не понимаю, что такое исключение ниже или что вызывает его. благодаря!

org.xmlpull.v1.XmlPullParserException: expected: START_TAG {employees}employees (position:START_TAG <employees>@2:12 in [email protected]) 

ответ

1

Here's a link to the parser.require() documentation.

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

Средний один вот что я думаю, что вызывает проблему. parser.require ищет правильный тип тега, правильное пространство имен и правильное имя тега; он выдает исключение, если одно из них не совпадает.

В вашем случае для среднего аргумента вы используете getName для получения имени текущего тега («сотрудники») и запроса parser.require(), чтобы проверить, совпадает ли это с пространством имен . Namespace - это совсем другое дело с именем тега, так что это вызовет исключение.

Вам не нужно использовать getName самостоятельно при использовании parser.require() вам просто нужно передать имя, которое вы ожидаете.

Согласно документации «null будет соответствовать любому пространству имен и любому имени». Если то, что вы делаете, проверяя, что у вас есть <employees> открывающий тег, то вы можете просто игнорировать пространства имен часть с помощью null в качестве имен аргумента:

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

Это проверить, что это начальный тег, и что имя тега - «сотрудники».

+0

ура Льюис. Наверное, я могу поставить нуль, но это как бы поражает цель. Таким образом getName() не получает имя тега. есть метод, который делает. Мне интересно, почему в документах они используют команду вообще, если они просто передают нуль? –

+0

getName() получает имя тега. Проблема здесь в том, что средний параметр в parser.require() для _namespace_, что другое. (Https://en.wikipedia.org/wiki/XML_namespace). Когда вы используете parser.require() в том, как я это указываю, вызывается getName(), чтобы проверить, соответствует ли он указанной вами строке («сотрудники»), просто вам не нужно ее вызывать. –

+0

Да, я не знаком с терминологией «пространства имен». Я собирался прочесть его в ту ночь. Большое спасибо за вашу помощь! –

Смежные вопросы