2017-01-13 7 views
1

何か問題があり、アプリケーションがクラッシュします。私はxmlテキストをJavaクラスに解析しようとしていますが、私はXStreamライブラリを使用しています。メソッドfromXMLを使用するとコードがクラッシュします。私のコード:java(android studio)のxstreamでXMLを解析する

XMLファイルには、次のようになります。

<FilesManifest> 
<Group> 
    <HeaderName>Pirmas hdr</HeaderName> 
    <Type>theory</Type> 
    <Piece> 
     <FileName>11.txt</FileName> 
     <HeadLine>hi1</HeadLine> 
    </Piece> 
    <Piece> 
     <FileName>22.txt</FileName> 
     <HeadLine>hi2</HeadLine> 
    </Piece> 
</Group> 

<Group> 
    <HeaderName>antras hdr</HeaderName> 
    <Type>theory</Type> 
    <Piece> 
     <FileName>33.txt</FileName> 
     <HeadLine>hi3</HeadLine> 
    </Piece> 
    <Piece> 
     <FileName>44.txt</FileName> 
     <HeadLine>hi4</HeadLine> 
    </Piece> 
</Group> 

<Group> 
    <HeaderName>tracias hdr</HeaderName> 
    <Type>test</Type> 
    <Piece> 
     <FileName>55.txt</FileName> 
     <HeadLine>hi5</HeadLine> 
    </Piece> 
    <Piece> 
     <FileName>66.txt</FileName> 
     <HeadLine>hi6</HeadLine> 
    </Piece> 
</Group> 
</FilesManifest> 

私の主な機能コード:

String fileText = ReadFile(); 
XStream xstream = new XStream(); 

xstream.alias("FilesManifest", MyFileManager.class); 
xstream.alias("Group", MyGroup.class); 
xstream.alias("Piece", MyPiece.class); 

MyFileManager data = (MyFileManager)xstream.fromXML(fileText); 

とXML構文解析のためのクラス:

public class MyFileManager { 
    public List<MyGroup> getGroups() { 
     return groups; 
    } 

    public void setGroups(List<MyGroup> groups) { 
     this.groups = groups; 
    } 
    @XStreamImplicit(itemFieldName = "group") 
    private List<MyGroup> groups = new ArrayList<MyGroup>(); 
} 

public class MyGroup { 
    private String headerName; 
    private String type; 

    @XStreamImplicit(itemFieldName = "piece") 
    private List<MyPiece> pieces = new ArrayList<MyPiece>(); 

    public List<MyPiece> getPieces() { 
     return pieces; 
    } 

    public void setPieces(List<MyPiece> pieces) { 
     this.pieces = pieces; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public String getHeaderName() { 
     return headerName; 
    } 

    public void setHeaderName(String headerName) { 
     this.headerName = headerName; 
    } 

} 

public class MyPiece { 
    private String fileName; 
    private String headLine; 

    public String getHeadLine() { 
     return headLine; 
    } 

    public void setHeadLine(String headLine) { 
     this.headLine = headLine; 
    } 

    public String getFileName() { 
     return fileName; 
    } 

    public void setFileName(String fileName) { 
     this.fileName = fileName; 
    } 
} 

だからあなたは私をアドバイスすることができますそのコードは正しく動作するでしょうか?多分、解析する別の方法がありますか?

答えて

1

私は2つの主要な問題を固定することにより、コードの作品を​​作ることができる:

  1. あなたはXML大文字と小文字が区別されることを忘れているように見えるので、あなたのマッピングが不完全と正しくありません例えば@XStreamImplicit(itemFieldName = "group")でなければならないことを意味しています@XStreamImplicit(itemFieldName = "Group")とし、すべてのフィールドに@XStreamAliasと注釈を付けて、エイリアスに大文字の最初の文字を指定する必要があります。
  2. 注釈が処理されないようにprocessAnnotations(Class type)に電話をかけていませんでした。

だから、最後にあなたのコードは、そのようなものでなければなりません:

あなたのPOJO:

public class MyFileManager { 
    ... 
    @XStreamImplicit(itemFieldName = "Group") 
    private List<MyGroup> groups = new ArrayList<>(); 
} 

public class MyGroup { 
    @XStreamAlias("HeaderName") 
    private String headerName; 
    @XStreamAlias("Type") 
    private String type; 

    @XStreamImplicit(itemFieldName = "Piece") 
    private List<MyPiece> pieces = new ArrayList<>(); 

    ... 
} 

public class MyPiece { 
    @XStreamAlias("FileName") 
    private String fileName; 
    @XStreamAlias("HeadLine") 
    private String headLine; 

    ... 
} 

あなたの主な機能コード:

... 
// Process the provided annotations 
xstream.processAnnotations(MyFileManager.class); 
MyFileManager data = (MyFileManager)xstream.fromXML(fileText); 
+1

私は自分自身にこの修正プログラムの2時間を検索: D、thnks –