从List中提取数据时ClassCastException

时间:2015-09-29 10:45:41

标签: java xml jaxb classcastexception pojo

这是我的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数据,而不是全部

1 个答案:

答案 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
}