gpt4 book ai didi

java - XStream - 解析嵌套元素(跳过父元素)

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:00 26 4
gpt4 key购买 nike

我有以下 XML,我正在尝试使用 XStream 解析它。问题是,一切正常,直到我达到<Keywords>...</Keywords>。元素。

我想获取所有 <KEYWORD>元素,无需创建一个类来处理 <KEYWORDS>

示例.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>

目录.java

@XStreamAlias("CATALOG")
public class Catalog {

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

// Getters and Setters

}

产品.java

@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

提前致谢!

最佳答案

我想如果你现在有“KEYWORD”的地方有“string”,你的XML会被正确解析。所以我想你的问题已经在这里得到解答:aliasing-contents-of-a-set-using-xstream

你可以尝试XStreamAliasType使用注释来完成此操作。

关于java - XStream - 解析嵌套元素(跳过父元素),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32078802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com