2014-06-08 65 views
0

我跑出什麼問題可能是..我使用的SimpleXML在Android思想未終止的實體裁判,並引發了以下堆棧跟蹤:從的SimpleXML拋出XmlPullParserException,無故

06-08 13:20:56.450: E/AndroidRuntime(2281): FATAL EXCEPTION: main 
06-08 13:20:56.450: E/AndroidRuntime(2281): java.lang.RuntimeException: org.xmlpull.v1.XmlPullParserException: unterminated entity ref (position:TEXT [email protected]:133 in [email protected]) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at com.example.stuff.manager.LevelManager.<init>(LevelManager.java:32) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at com.example.stuff.fragment.MainMenuFragment.onClick(MainMenuFragment.java:138) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at android.view.View.performClick(View.java:2485) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at android.view.View$PerformClick.run(View.java:9080) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at android.os.Handler.handleCallback(Handler.java:587) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at android.os.Looper.loop(Looper.java:130) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at java.lang.reflect.Method.invoke(Method.java:507) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at dalvik.system.NativeStart.main(Native Method) 
06-08 13:20:56.450: E/AndroidRuntime(2281): Caused by: org.xmlpull.v1.XmlPullParserException: unterminated entity ref (position:TEXT [email protected]:133 in [email protected]) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.kxml2.io.KXmlParser.exception(KXmlParser.java:273) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.kxml2.io.KXmlParser.error(KXmlParser.java:269) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.kxml2.io.KXmlParser.pushEntity(KXmlParser.java:781) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.kxml2.io.KXmlParser.pushText(KXmlParser.java:849) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.kxml2.io.KXmlParser.nextImpl(KXmlParser.java:354) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.kxml2.io.KXmlParser.next(KXmlParser.java:1378) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.simpleframework.xml.stream.PullReader.read(PullReader.java:105) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.simpleframework.xml.stream.PullReader.next(PullReader.java:89) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.simpleframework.xml.stream.NodeReader.readElement(NodeReader.java:111) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.simpleframework.xml.stream.NodeReader.readRoot(NodeReader.java:85) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.simpleframework.xml.stream.NodeBuilder.read(NodeBuilder.java:84) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.simpleframework.xml.stream.NodeBuilder.read(NodeBuilder.java:71) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.simpleframework.xml.core.Persister.read(Persister.java:562) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at org.simpleframework.xml.core.Persister.read(Persister.java:462) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  at com.example.stuff.manager.LevelManager.<init>(LevelManager.java:27) 
06-08 13:20:56.450: E/AndroidRuntime(2281):  ... 12 more 

加載下面的XML文件:

<levels> 
<level id="1" time="400"> 
    <fruitdatas> 
     <fruitdata id="2" row="1" column="1"></fruitdata> 
     <fruitdata id="0" row="1" column="2"></fruitdata> 
     <fruitdata id="3" row="1" column="3"></fruitdata> 
     <fruitdata id="4" row="1" column="4"></fruitdata> 
    </fruitdatas> 
</level> 
</levels> 

而且隨着我作爲集裝箱製造在XML的東西以下的POJOs:

FruitData.java:

@Root 
public class Fruitdata 
{ 
@Attribute 
private Integer id; 
@Attribute 
private Integer row; 
@Attribute 
private Integer column; 

public Integer getId() 
{ 
    return id; 
} 
public void setId(Integer id) 
{ 
    this.id = id; 
} 
public int getRow() 
{ 
    return row; 
} 
public void setRow(int row) 
{ 
    this.row = row; 
} 
public int getColumn() 
{ 
    return column; 
} 
public void setColumn(int column) 
{ 
    this.column = column; 
} 
} 

FruitDatas.java:

@Root 
public class Fruitdatas 
{ 
@ElementList 
private List<Fruitdata> fruitdatas; 

public Fruitdatas() 
{ 

} 

public Fruitdatas(@ElementList(name = "fruitdatas") List<Fruitdata> fruitdatas) 
{ 
    this.fruitdatas = fruitdatas; 
} 

public List<Fruitdata> getFruitdatas() 
{ 
    return fruitdatas; 
} 

public void setFruitdatas(List<Fruitdata> fruitdatas) 
{ 
    this.fruitdatas = fruitdatas; 
} 
} 

Level.java:

@Root 
public class Level 
{ 
@Attribute 
private Long id; 

@Attribute 
private Long time; 

@ElementList 
private List<Fruitdata> fruitdatas; 

public Long getId() 
{ 
    return id; 
} 

public void setId(Long id) 
{ 
    this.id = id; 
} 

public Long getTime() 
{ 
    return time; 
} 

public void setTime(Long time) 
{ 
    this.time = time; 
} 

public List<Fruitdata> getFruitdatas() 
{ 
    return fruitdatas; 
} 

public void setFruitdatas(List<Fruitdata> fruits) 
{ 
    this.fruitdatas = fruits; 
} 
} 

Levels.java:

@Root 
public class Levels 
{ 
@ElementList 
private List<Level> levels; 

public Levels() 
{ 

} 

public Levels(@ElementList(name = "levels") List<Level> levels) 
{ 
    this.levels = levels; 
} 


public List<Level> getLevels() 
{ 
    return levels; 
} 

public void setLevels(List<Level> levels) 
{ 
    this.levels = levels; 
} 
} 

裝載發生在這裏:

public LevelManager() 
{ 
    Serializer serializer = new Persister(); 
    Levels levels = null; 
    BufferedReader br = null; 
    try 
    { 
     br = new BufferedReader(new InputStreamReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("res/xml/levels.xml"))); 
     levels = serializer.read(Levels.class, br); 
    } 
    catch (Exception e) 
    { 
     Log.e(getClass().getSimpleName(), "Error in deserialization.", e); 
     throw new RuntimeException(e); 
    } 
    finally 
    { 
     if (br != null) 
     { 
      try 
      { 
       br.close(); 
      } 
      catch (IOException e) 
      { 
      } 
     } 
    } 
    if (levels != null) 
    { 
     this.levels = levels.getLevels(); 
    } 
} 

我也試過它只使用InputStream,但我得到了同樣的錯誤。 我已經搜索了答案,但它始終是在XML中未轉義的東西。我甚至沒有任何應該逃跑的角色。

我甚至檢查XML解析器在拋出異常的源代碼,但它是相當無益:

723  private final void More ...pushEntity() 
724   throws IOException, XmlPullParserException { 
725 
726   push(read()); // & 
727   
728   
729   int pos = txtPos; 
730 
731   while (true) { 
732    int c = read(); 
733    if (c == ';') 
734     break; 
735    if (c < 128 
736     && (c < '0' || c > '9') 
737     && (c < 'a' || c > 'z') 
738     && (c < 'A' || c > 'Z') 
739     && c != '_' 
740     && c != '-' 
741     && c != '#') { 
742     if(!relaxed){ 
743      error("unterminated entity ref"); 
744     } 
745     //; ends with:"+(char)c);   
746     if (c != -1) 
747      push(c); 
748     return; 
749    } 
750 
751    push(c); 
752   } 
753 
754   String code = get(pos); 
755   txtPos = pos - 1; 
756   if (token && type == ENTITY_REF){ 
757    name = code; 
758   } 
759 
760   if (code.charAt(0) == '#') { 
761    int c = 
762     (code.charAt(1) == 'x' 
763      ? Integer.parseInt(code.substring(2), 16) 
764      : Integer.parseInt(code.substring(1))); 
765    push(c); 
766    return; 
767   } 
768 
769   String result = (String) entityMap.get(code); 
770 
771   unresolved = result == null; 
772 
773   if (unresolved) { 
774    if (!token) 
775     error("unresolved: &" + code + ";"); 
776   } 
777   else { 
778    for (int i = 0; i < result.length(); i++) 
779     push(result.charAt(i)); 
780   } 
781  } 

我不知道是什麼輕鬆的方式!因此,我完全沒有想到如何解決這個問題。

有沒有人碰到過這個?我可能做錯了什麼?我只是沒有看到任何錯誤,即使我的XML是有效的。我想我也正確地註釋了這些課程。有任何想法嗎?

編輯:顯然我的調試感覺刺痛,我通過System.out發送bufferedReader的內容。

結果:

06-08 13:47:51.830: I/System.out(2334): ????T???????????????????????????????????h?????????????????????? ????????????????????????!??????'[email protected]??????D??????J??????S??????W??????[??????_??????c??????g??????k??????o??????levels??id??time??level??1??400?? 
06-08 13:47:51.830: I/System.out(2334): fruitdatas??  fruitdata??0??row??column??2??4??3??5??6??7??8??9??????$??????????????????????????????????????????????????L???????????????????????????????????????????????????????????????????????????????????????????????$????????????????????????????????????????????????$????????????????????????????????????????????????$??????????????????????????????????????????????????????????????????????????????????????????????????????????????????$???????????????????? ?????????????????????????????????????????????????????????????????????????????????????? ????????$???????????????????? 
06-08 13:47:51.830: I/System.out(2334): ?????????????????????????????????????????????????????????????????????????????????????? 
06-08 13:47:51.830: I/System.out(2334): ?????????????? ??????????????????????$?????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????????????$??????????????????????????????????????????????????????????????????????????????????????????????????????????????????$???????????????????? ?????????????????????????????????????????????????????????????????????????????????????? ????????$?????? 
06-08 13:47:51.830: I/System.out(2334): ?????????????? 
06-08 13:47:51.830: I/System.out(2334): ?????????????????????????????????? 
06-08 13:47:51.830: I/System.out(2334): ?????????????????????????????????????? 
06-08 13:47:51.830: I/System.out(2334): ?????????????? 
06-08 13:47:51.830: I/System.out(2334): ????????????????????????????????????$????????????????????????????????????????????????$??????????????????????????????????????????????????????????????????????????????????????????????????????????????????$???????????????????? ?????????????????????????????????????????????????????????????????????????????????????? ????????$???????????????????? 
06-08 13:47:51.830: I/System.out(2334): ?????????????????????????????????????????????????????????????????????????????????????? 
06-08 13:47:51.830: I/System.out(2334): ????????????????????????????????????$????????????????????????????????????????????????$??????????????????????????????????????????????????????????????????????????????????????????????????????????????????$???????????????????? ?????????????????????????????????????????????????????????????????????????????????????? ????????$???????????????????? 
06-08 13:47:51.830: I/System.out(2334): ???????????????????????????????????????????? 
06-08 13:47:51.830: I/System.out(2334): ?????????????????????????????????????????? 
06-08 13:47:51.830: I/System.out(2334): ????????????????????????????????????$????????????????????????????????????????????????$??????????????????????????????????????????????????????????????????????????????????????????????????????????????????$???????????????????? ?????????????????????????????????????????????????????????????????????????????????????? ????????$???????????????????? 
06-08 13:47:51.830: I/System.out(2334): ?????????????????????????????????????????????????????????????????????????????????????? 
06-08 13:47:51.830: I/System.out(2334): ????????????????????????????????????$????????????????????????????????????????????????$??????????????????????????????????????????????????????????????????????????????????????????????????????????????????$?????? ?????????????? ?????????????????????????????????? ?????????????????????????????????????? ?????????????? ????????$??????!?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????!??????????????????????????????????????!?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????"??????????????????????$??????#??????????????????????????????????????????$??????$????????????????????????????????????????????????$?????????? 
06-08 13:47:51.830: I/System.out(2334): ????????????????????????????$??????????????????????$??????%?????????????? ??????????????????????????????????%??????????????????????????????????????%?????????????? ????????$??????&?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????&??????????????????????????????????????&?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????'??????????????????????$??????(??????????????????????????????????????????$??????)????????????????????????????????????????????????)??????????????????????????????????????)??????????????????????$??????*?????????????? ??????????????????????????????????*??????????????????????????????????????*?????????????? ????????$??????+?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????+??????????????????????????????????????+?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????,??????????????????????$??????-??????????????????????????????????????????$??????.????????????????????????????????????????????????.??????????????????????????????????????.??????????????????????$??????/?????????????? ??????????????????????????????????/??????????????????????????????????????/?????????????? ????????$??????0?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????0??????????????????????????????????????0?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????1??????????????????????$??????2??????????????????????????????????????????$??????3????????????????????????????????????????????????3??????????????????????????????????????3??????????????????????$??????4?????????????? ??????????????????????????????????4??????????????????????????????????????4?????????????? ????????$??????5?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????5??????????????????????????????????????5?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????6??????????????????????$??????7??????????????????????????????????????????$??????8????????????????????????????????????????????????8??????????????????????????????????????8??????????????????????$??????9?????????????? ??????????????????????????????????9??????????????????????????????????????9?????????????? ????????$??????:?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????:??????????????????????????????????????:?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????;??????????????????????$??????<??????????????????????????????????????????$??????=????????????????????????????????????????????????=??????????????????????????????????????=??????????????????????$??????>?????????????? ??????????????????????????????????>??????????????????????????????????????>?????????????? ????????$????????????????????? 
06-08 13:47:51.830: I/System.out(2334): ???????????????????????????????????????????????????????????????????????????????????????? 
06-08 13:47:51.830: I/System.out(2334): [email protected]??????????????????????$??????A??????????????????????????????????????????$??????B????????????????????????????????????????????????B??????????????????????????????????????B??????????????????????$??????C?????????????? ??????????????????????????????????C??????????????????????????????????????C?????????????? ????????$??????D?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????D??????????????????????????????????????D?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????E??????????????????????$??????F??????????????????????????????????????????$??????G????????????????????????????????????????????????G?????????? 
06-08 13:47:51.830: I/System.out(2334): ????????????????????????????G??????????????????????$??????H?????????????? ??????????????????????????????????H??????????????????????????????????????H?????????????? ????????$??????I?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????I??????????????????????????????????????I?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????J??????????????????????$??????K??????????????????????????????????????????$??????L????????????????????????????????????????????????L??????????????????????????????????????L??????????????????????$??????M?????????????? ??????????????????????????????????M??????????????????????????????????????M?????????????? ????????$??????N?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????N?????????? 
06-08 13:47:51.830: I/System.out(2334): ????????????????????????????N?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????O??????????????????????$??????P??????????????????????????????????????????$??????Q????????????????????????????????????????????????Q??????????????????????????????????????Q??????????????????????$??????R?????????????? ??????????????????????????????????R??????????????????????????????????????R?????????????? ????????$??????S?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????S??????????????????????????????????????S?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????T??????????????????????$??????U??????????????????????????????????????????$??????V????????????????????????????????????????????????V??????????????????????????????????????V??????????????????????$??????W?????????????? ??????????????????????????????????W??????????????????????????????????????W?????????????? ????????$??????X?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????X??????????????????????????????????????X?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????Y??????????????????????$??????Z??????????????????????????????????????????$??????[????????????????????????????????????????????????[?????????? 
06-08 13:47:51.830: I/System.out(2334): ????????????????????????????[??????????????????????$??????\?????????????? ??????????????????????????????????\??????????????????????????????????????\?????????????? ????????$??????]?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????]??????????????????????????????????????]?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????^??????????????????????$??????_??????????????????????????????????????????$??????`????????????????????????????????????????????????`??????????????????????????????????????`??????????????????????$??????a?????????????? ??????????????????????????????????a??????????????????????????????????????a?????????????? ????????$??????b?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????b??????????????????????????????????????b?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????c??????????????????????$??????d??????????????????????????????????????????$??????e????????????????????????????????????????????????e??????????????????????????????????????e??????????????????????$??????f?????????????? ??????????????????????????????????f??????????????????????????????????????f?????????????? ????????$??????g?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????g??????????????????????????????????????g?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????h??????????????????????$??????i??????????????????????????????????????????$??????j????????????????????????????????????????????????j?????????? 
06-08 13:47:51.830: I/System.out(2334): ????????????????????????????j??????????????????????$??????k?????????????? ??????????????????????????????????k??????????????????????????????????????k?????????????? ????????$??????l?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????????????????????????l??????????????????????????????????????l?????????????? 
06-08 13:47:51.830: I/System.out(2334): ??????????????m????????????????????????????n????????????????????????????o????????????????????????????p?????????????????????? 

我會嘗試找出爲什麼我從流中讀取的XML是總胡言亂語....

回答

0

我已經找到了解決辦法,顯然我調試的感覺設法讓我走向正確的方向。

所以顯然與

br = new BufferedReader(new InputStreamReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("res/xml/levels.xml"))); 

讀取數據是一個可怕的想法。解決方案是將XML文件放入/ res/raw文件夾,並將其作爲原始資源打開。

public LevelManager(Context context) 
    { 
     Serializer serializer = new Persister(); 
     Levels levels = null; 
     BufferedReader br = null; 

     try 
     { 
      br = new BufferedReader(new InputStreamReader(context.getResources().openRawResource(R.raw.levels))); 
      levels = serializer.read(Levels.class, br); 
     } 
     catch (Exception e) 
     { 
      Log.e(getClass().getSimpleName(), "Error in deserialization.", e); 
      throw new RuntimeException(e); 
     } 
     finally 
     { 
      if (br != null) 
      { 
       IOUtils.closeQuietly(br); 
      } 
     } 

這樣,文件的內容被正確讀取。

我希望這將幫助別人的未來,並希望不只是一個問題,我在20分鐘後得到解決堵塞SO:d

編輯: 另外,我需要添加

@Root 
public class Levels 
{ 

@ElementList(type=Level.class, inline=true) 
private List<Level> levels; 

public Levels() 
{ 

} 

public Levels(@ElementList(name = "levels", type=Level.class, inline=true) List<Level> levels) 
{ 
    this.levels = levels; 
} 


public List<Level> getLevels() 
{ 
    return levels; 
} 

public void setLevels(List<Level> levels) 
{ 
    this.levels = levels; 
    } 
} 

inline = true,否則它根據我的XML結構找不到數據。但那與問題沒有關係。