2013-05-09 45 views
3

我正在使用XStream讀取下面的示例xml文件。如何通過XStream讀取具有屬性的列表元素

<list> 
    <file>/setup/x86-linux2/bin/zip.txt</file> 
    <file type="dir">/src/bin/</file> 
    <name>test xml</name> 
</list> 

下面是我在閱讀了上面的XML代碼,

public class ListWithConverter { 

    public static class FileConvertor implements Converter { 
     public boolean canConvert(final Class clazz) { 
      return clazz.equals(MyFile.class); 
     } 

     public void marshal(Object source, HierarchicalStreamWriter writer, 
       MarshallingContext context) { 
      throw new UnsupportedOperationException("Not supported to write file element yet."); //$NON-NLS-1$ 
     } 

     public Object unmarshal(HierarchicalStreamReader reader, 
       UnmarshallingContext context) { 
      MyFile file = new MyFile(); 
      for (Iterator<String> iter = reader.getAttributeNames(); iter.hasNext();){ 
       String name = iter.next(); 
       if (name.equals("type")) //$NON-NLS-1$ 
        file.type = reader.getAttribute(name); 
      } 
      file.path = reader.getValue(); 
      return file; 
     } 
    } 

    @XStreamAlias("list") 
    public class MyList { 
     @XStreamAlias("name") 
     String name; 
     @XStreamImplicit(itemFieldName="file") @XStreamConverter(FileConvertor.class) 
     List<MyFile> files; 
    } 

    public static class MyFile { 
     String type; 
     String path; 
    } 

    public static void main(String[] args) throws MalformedURLException, IOException { 
     XStream xstream = new XStream(); 
     xstream.setClassLoader(MyList.class.getClassLoader()); 
     xstream.processAnnotations(MyList.class); 
     InputStream stream = new File("test.xml").toURL().openStream(); 
     MyList list = (MyList)xstream.fromXML(stream); 
     System.out.println(list.name); 
     for (MyFile f : list.files) { 
      System.out.println(f.path); 
     } 
    } 
} 

我的程序的輸出,

test xml 
null 
null 

看起來像XStream的使用註釋不支持 '@XStreamImplicit' 和'@XStreamConverter'在同一時間。

我的問題是我應該怎麼做通過XStream讀取示例xml?

回答

3

我找到了一個解決方案遷移到XStream的1.4.x的後,

@XStreamAlias("list") 
public class MyList { 
    @XStreamAlias("name") 
    String name; 
    @XStreamImplicit(itemFieldName="file") 
    List<MyFile> files; 
} 

@XStreamAlias("file") 
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"path"}) 
public static class MyFile { 
    @XStreamAlias("type") 
    @XStreamAsAttribute 
    String type; 

    String path; 
} 
相關問題