2015-08-18 8 views
1

У меня есть следующий XML, который я пытаюсь разобрать с помощью XStream. Дело в том, что все работает отлично до такой степени, что я добираюсь до элемента <Keywords>...</Keywords>.XStream - Разбор вложенных элементов (пропуская родительский элемент)

Я хотел бы получить все <KEYWORD> элементов, без того, чтобы сделать класс для обработки <KEYWORDS>

sample.xml

<CATALOG> 
    <PRODUCTS> 
    <PRODUCT> 
     <PRODUCTOID>123</PRODUTOID> 
     <PRODUCTNAME>TEST NAME</NOMEPRODUTO> 
     <DESCRIPTION>TEST DESCRIPTION</DESCRIPTION> 
     <KEYWORDS> 
     <KEYWORD>keyword_1</KEYWORD> 
     <KEYWORD>keyword_2</KEYWORD> 
     <KEYWORD>keyword_3</KEYWORD> 
     <KEYWORD>keyword_n</KEYWORD> 
     <KEYWORDS> 
    </PRODUCT> 
    </PRODUCTS> 
</CATALOG> 

в Catalog.java

@XStreamAlias("CATALOG") 
public class Catalog { 

    @XStreamAlias("PRODUCTS") 
    private List<Product> products; 

    // Getters and Setters 

} 

Продукты.ява

@XStreamAlias("PRODUCT") 
public class Product { 

    @XStreamAlias("PRODUCTID") 
    private String id; 

    @XStreamAlias("PRODUCTNAME") 
    private String name; 

    @XStreamAlias("DESCRIPTION") 
    private String description; 


    // @XStreamImplicit(itemFieldName = "KEYWORD") 
    // the above line works, *IF* I delete the parent node `<KEYWORDS>`, 
    // but that's not the case, I have to deal with it 

    // @StreamAlias("KEYWORDS/KEYWORD") 
    // this doesn't work 

    @StreamAlias("KEYWORDS") 
    // and this returns the error I'm posting below after this class 
    private List<String> keywords; 

    // Getters and Setters 

} 

XStreamTest.java

public class XStreamTest { 

    public static void main(String[] args) { 

    String filepath = "Sample.xml"; 

    try { 
     FileReader reader = new FileReader(filepath); 
     XStream xstream = new XStream(); 

     xstream.processAnnotations(Catalog.class); 
     xstream.processAnnotations(Product.class); 

     Catalog catalog = (Catalog) xstream.fromXML(reader); 
     System.out.println(catalog.getProducts().get(0).getKeywords().get(0)); 
    } 

    catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

} 

С текущей настройки, это то, что я получаю (я знаю, почему я получаю это ... Я не отображающая элемент <KEYWORD> в любом месте.

Но я действительно НЕ хочу сделать еще один класс, скажем, «Keyword.java» просто иметь дело с этим <KEYWORDS> (как я сделал для управления элементами внутри <PRODUCT> элемента.

Есть в любом случае я может решить эту проблему (без того, чтобы сделать еще один класс)?

Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: KEYWORD: KEYWORD 
---- Debugging information ---- 
message    : KEYWORD 
cause-exception  : com.thoughtworks.xstream.mapper.CannotResolveClassException 
cause-message  : KEYWORD 
class    : java.util.ArrayList 
required-type  : java.util.ArrayList 
converter-type  : com.thoughtworks.xstream.converters.collections.CollectionConverter 
path    : /CATALOG/PRODUCTS/PRODUCT/KEYWORDS/KEYWORD 
line number   : 9 
class[1]   : obscured_package.model.Product 
converter-type[1] : com.thoughtworks.xstream.converters.reflection.ReflectionConverter 
class[2]   : obscured_package.model.Catalog 
version    : 1.4.8 
------------------------------- 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:79) 
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:480) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:412) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:263) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) 
    at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:71) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.addCurrentElementToCollection(CollectionConverter.java:98) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:91) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:85) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:80) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:480) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:412) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:263) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134) 
    at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) 
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1206) 
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1190) 
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1061) 
    at br.com.multiplusfidelidade.ecommerce.netshoes.batch.App.main(App.java:21) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: PALAVRA 
    at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:79) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47) 
    at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29) 
    at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:70) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.addCurrentElementToCollection(CollectionConverter.java:98) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:91) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:85) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:80) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 
    ... 35 more 

Process finished with exit code 1 

заранее спасибо!

ответ

0

Я думаю, ваш XML будет обработан правильно, если бы у вас была «строка», где йо У вас теперь есть «KEYWORD». Итак, на ваш вопрос уже был дан ответ: aliasing-contents-of-a-set-using-xstream

Вы можете попробовать XStreamAliasType, чтобы сделать это с помощью аннотации.

+0

вещь: это реальная жизнь pplication, где Input XML точно так же, как и образец, который я написал, у меня нет возможности установить его как «String», где «Keyword». И я действительно хотел бы избежать использования String.replace, чтобы изменить это для String .... –

+0

Вот почему я предлагаю вам объяснить xstream, чтобы понять тип «String», когда он читает «KEYWORD». Это то, что связанный ответ делает с вызовами методов и связанной аннотацией (надеюсь) в вашем классе данных. –

+0

Я проверил эту ссылку, на которую вы ссылались, но она делает то же самое, что я пытаюсь сделать, это объект, который сериализуется в XML, и мне нужен XML, сериализованный в Object. Я попытался использовать XStreamAliasType, но это не сработало) ... –

0

Я изменил код в двух отношениях:

  • Я добавил «/» до закрытия тега <KEYWORDS>
  • Я добавил вызов xstream.alias() для отображения «KEYWORD» в класс Строка

это выводит «keyword_1» для меня:

public static void main(String[] args) 
{ 
    String xml = 
     "<CATALOG>\n"+ 
     " <PRODUCTS>\n"+ 
     " <PRODUCT>\n"+ 
     "  <PRODUCTID>123</PRODUCTID>\n"+ 
     "  <PRODUCTNAME>TEST NAME</PRODUCTNAME>\n"+ 
     "  <DESCRIPTION>TEST DESCRIPTION</DESCRIPTION>\n"+ 
     "  <KEYWORDS>\n"+ 
     "  <KEYWORD>keyword_1</KEYWORD>\n"+ 
     "  <KEYWORD>keyword_2</KEYWORD>\n"+ 
     "  <KEYWORD>keyword_3</KEYWORD>\n"+ 
     "  <KEYWORD>keyword_n</KEYWORD>\n"+ 
     "  </KEYWORDS>\n"+ // <-- 
     " </PRODUCT>\n"+ 
     " </PRODUCTS>\n"+ 
     "</CATALOG>"; 
    XStream xstream = new XStream(); 

    xstream.alias("KEYWORD", String.class); // <-- 
    xstream.processAnnotations(Catalog.class); 
    xstream.processAnnotations(Product.class); 

    Catalog catalog = (Catalog) xstream.fromXML(xml); 
    System.out.println(catalog.products.get(0).keywords.get(0)); 
} 

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

  • Нет связанных вопросов^_^