【发布时间】:2019-12-06 16:03:30
【问题描述】:
我需要构建一个解析器来将XML 文件解析为Java 对象。
我使用Jackson 来执行此操作,并按照THIS 教程中提供的步骤进行操作。
本教程中有一节“在 XML 中操作嵌套元素和列表”。我跟着它,但不幸的是,我无法获得所有所需元素的所需输出 - 我想输出我所有作者的第一个和最后一个。我只在XML-file 中为我的最后一位作者得到它,如下所示:
[{nameList={person={first=Karl, last=S}}}]
我的XML 文件如下所示。
<sources>
<Doi>123456789</Doi>
<Title>Title</Title>
<author>
<editor>
<nameList>
<person>
<first>Peter</first>
<last>Parker</last>
</person>
</nameList>
</editor>
</author>
<Source>
<SourceType>Book</SourceType>
<ShortTitle>Book Title</ShortTitle>
<Author>
<Editor>
<NameList />
</Editor>
</Author>
</Source>
<author>
<bookAuthor>
<nameList>
<person>
<first>Karl</first>
<last>S</last>
</person>
</nameList>
</bookAuthor>
</author>
<Source>
<SourceType>Journal</SourceType>
<ShortTitle>ABC Journal</ShortTitle>
</Source>
</sources>
我怎样才能取消整个 XML 文件的实现?
我的代码如下所示: MyClass.java
private static void jacksonXmlFileToObject() throws IOException {
System.out.println("jacksonXmlFileToObject");
InputStream xmlFile = Publication.class.getClassLoader().getResourceAsStream("test.xml");
ObjectMapper mapper = new XmlMapper();
// Configure
mapper
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
try {
Sources deserializedData = mapper.readValue(xmlFile, Sources.class);
System.out.println(deserializedData);
} catch (IOException e) {
e.printStackTrace();
}
}
Sources.java
@EqualsAndHashCode
@JacksonXmlRootElement(localName = "sources") public class Sources {
@JacksonXmlElementWrapper(localName = "author")
@Getter
@Setter
private Object[] author;
@Override
public String toString() {
return Arrays.toString(author);
}
public Sources() {
}
}
如果能得到一些帮助,我会很高兴的。
谢谢!
【问题讨论】:
-
看起来您有
<author>和<Source>混合节点。如果您需要作者,这意味着您需要跳过所有<Source>节点,对吗?为什么你的输出不包含Peter Parker? -
@MichałZiober 感谢您的回复。是的,我有混合节点,但我只想拥有作者,分别为
first和last。而且我不确定为什么我的输出不包含Peter Parker?
标签: java xml parsing jackson pojo