У меня есть следующий 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
заранее спасибо!
вещь: это реальная жизнь pplication, где Input XML точно так же, как и образец, который я написал, у меня нет возможности установить его как «String», где «Keyword». И я действительно хотел бы избежать использования String.replace, чтобы изменить это для String .... –
Вот почему я предлагаю вам объяснить xstream, чтобы понять тип «String», когда он читает «KEYWORD». Это то, что связанный ответ делает с вызовами методов и связанной аннотацией (надеюсь) в вашем классе данных. –
Я проверил эту ссылку, на которую вы ссылались, но она делает то же самое, что я пытаюсь сделать, это объект, который сериализуется в XML, и мне нужен XML, сериализованный в Object. Я попытался использовать XStreamAliasType, но это не сработало) ... –