这是我的XML文件: -
n INTEGER NULL
我使用过JAXB并为它创建了POJO类结构。
对于<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<logExtract>
<configuration>
<splunk>
<splunkHost>localhost</splunkHost>
<userName>abcd</userName>
<password>1234</password>
<port>8214</port>
</splunk>
<tsdb>
<tsdbHost>localhsot</tsdbHost>
<port>4242</port>
</tsdb>
</configuration>
<dataPart>
<ingestion id="abc">
<tsdbElements>
<metricname>linecount0</metricname>
<tags>splunk_server0</tags>
</tsdbElements>
<splunkQuery>
<Query>index=_internal source=*/splunkd_access.log |head 0000</Query>
</splunkQuery>
</ingestion>
<ingestion id="xyz">
<tsdbElements>
<metricname>linecount</metricname>
<tags>splunk_server</tags>
</tsdbElements>
<splunkQuery>
<query>index=_internal source=*/splunkd_access.log |head 1000</query>
</splunkQuery>
</ingestion>
<ingestion id="def">
<tsdbElements>
<metricname>linecount2</metricname>
<tags>splunk_server2</tags>
</tsdbElements>
<splunkQuery>
<query>index=_internal source=*/splunkd_access.log |head 2000</query>
</splunkQuery>
</ingestion>
</dataPart>
</logExtract>
元素,这是我的POJO类结构。
Ingestion
以下是问题: -
当我尝试提取private String id;
private List<TsdbElements> TsdbElements;
private List<SplunkQuery> SplunkQuery;
@XmlAttribute
public String getId ()
{
return id;
}
public void setId (String id)
{
this.id = id;
}
@XmlElement
public List<TsdbElements> getTsdbElements ()
{
return TsdbElements;
}
public void setTsdbElements (List<TsdbElements> TsdbElements)
{
this.TsdbElements = TsdbElements;
}
@XmlElement
public List<SplunkQuery> getSplunkQuery ()
{
return SplunkQuery;
}
public void setSplunkQuery (List<SplunkQuery> SplunkQuery)
{
this.SplunkQuery = SplunkQuery;
}
@Override
public String toString()
{
return "ClassPojo [id = "+id+", TsdbElements = "+TsdbElements+", SplunkQuery = "+SplunkQuery+"]";
}
的对象时,我收到错误
(java.util.ArrayList不能转换为com.jaxb.xmlfile.Ingestio)java.lang.ClassCastException
在评论下面的行。
ingestion
那么我错过了什么?
编辑: - (@Sanj给出答案后)
如何使用String fileName = "Query.xml";
File file = new File(fileName);
//JAXB Parsing - Unmarshling XML File
JAXBContext jaxbContext = JAXBContext.newInstance(XMLData.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
LogExtract logExtract = (LogExtract) jaxbUnmarshaller.unmarshal(file);
Configuration config = logExtract.getConfiguration();
Splunk spluknData = config.getSplunk();
Tsdb tsdbData = config.getTsdb();
DataPart dataPart = logExtract.getDataPart();
List<Ingestion> ingestionData = dataPart.getIngestion();
//Here I get Error
List<TsdbElements> tsdbElementsData = ((Ingestion) ingestionData).getTsdbElements();
//Here I get Error
List<SplunkQuery> splunkQueryData = ((Ingestion) ingestionData).getSplunkQuery();
System.out.println(spluknData.getSplunkHost() + " " + spluknData.getUserName() + " " + spluknData.getPassword() + " " +spluknData.getPort());
System.out.println(tsdbData.getTsdbHost() + " " + tsdbData.getPort());
for (SplunkQuery splunkQuery : splunkQueryData) {
System.out.println(splunkQuery.getQuery());
}
for (TsdbElements tsdbElements : tsdbElementsData) {
System.out.println(tsdbElements.getMetricname() + " " + tsdbElements.getTags());
}
循环保存tsdbElement
数据,然后再次从for
循环访问它们?任何的想法?因为它只保存最后的XML数据,而不是全部
答案 0 :(得分:0)
List<Ingestion> ingestionData = dataPart.getIngestion();
//Here I get Error
List<TsdbElements> tsdbElementsData = ((Ingestion) ingestionData).getTsdbElements();
错误是声明ingestionData是一个类型List,并且您正在尝试将其强制转换为Ingestion类。
查看XML,您有一个这些元素的列表
<ingestion id="abc">
<tsdbElements>
<metricname>linecount0</metricname>
<tags>splunk_server0</tags>
</tsdbElements>
<splunkQuery>
<Query>index=_internal source=*/splunkd_access.log |head 0000</Query>
</splunkQuery>
</ingestion>
所以你只需要迭代列表ingestionData来获取tsdbElements。像
这样的东西// instantiate the tsdbElementsData list
List<TsdbElements> tsdbElementsData = new ArrayList<>(TsdbElements)
for (Ingestion ingestion: ingestionData)
{
// get the elements
tsdbElements = ingestion.getTsdbElements();
// do some with the elements, e,g add to a another list
tsdbElementsData.add(tsdbElements);
}
要遍历tsdbElementsData列表,它只是另一个循环
for (TsdbElements tsdbElements: tsdbElementsData)
{
// ... do something with tsdbElements
}
请注意,上面的foreach循环与写作相同
for (int i = 0; i < tsdbElementsData.size(); i++)
{
TsdbElements tsdbElements = tsdbElementsData.get(i);
// ... do something with tsdbElements
}