使用JAXB基于属性值解析XML文件

时间:2014-03-03 10:22:43

标签: java xml xml-parsing jaxb

我有一个基于Maven和Spring的Java Web应用程序。

我在src / main / resources中有一个 config.xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<sourceConfigs>
    <areas>
        <area name="Defects">
            <fileHeaders>ID,Issue Key,Fields
            </fileHeaders>
        </area>
        <area name="Organization">
            <fileHeaders>ID,Org Key,Fields
            </fileHeaders>
        </area>
    </areas>
    <sourceTypes>
        <source name="source1">
            <adapterObject>source1Adapter</adapterObject>
            <resultObject>JsonObject</resultObject>
        </source>
        <source name="source2">
            <adapterObject>source2Adapter</adapterObject>
            <resultObject>sourceObject</resultObject>
        </source>
    </sourceTypes>
</sourceConfigs>

我想根据属性将上述XML解析为Java对象。

我创建了两个类。

Area.java

@XmlRootElement(name="area")
public class Area {
        String name;
    String fileHeaders;

    @XmlAttribute
    //get Name
    //set Name

    @XmlElement
    //get fileHeaders
    //set FileHeaders
}

Source.java

@XmlRootElement(name="source")
public class Source {
        String name;
    String adapterObject;
    String resultObject;

    @XmlAttribute
    //get Name
    //set Name

    @XmlElement
    //get adapterObject
    //set adapterObject

    @XmlElement
    //get resultObject
    //set resultObject
}

我想根据属性值解析XML。  即;如果area的属性值为Defects,则解析后的对象应具有基于该值的值,否则如果其为Organization,则基于该值和对象类型的值为 Area 对象。同样,对于来源类型也是如此。

我该怎么做?

当它只是一个简单的XML文件,如下面的

<?xml version="1.0" encoding="UTF-8"?>
<sourceConfig area="Defects">
    <adapterObject>jAdapter</adapterObject>
    <resultObject>jsonObject</resultObject>
</sourceConfig>

我的POJO基于此,我以前解析的代码是

public SourceConfig getConfigObject() throws JAXBException, IOException {
        JAXBContext jaxbContext = JAXBContext.newInstance(SourceConfig.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

        Resource resource=new ClassPathResource("config.xml");
        File file=resource.getFile();

        SourceConfig sourceConfig = (SourceConfig) jaxbUnmarshaller.unmarshal(file);
        return sourceConfig;
    }

但对于这个复杂的我不知道如何根据属性值以及多个数据列表进行解析。

如何根据属性值进行解析? 我创建了两个用于解析不同类型的POJO。如果它是一个单一的课程也没关系。

更新1

我的预期产量。

当我在解组Area对象时传递值"Defects"时,值应为

name= Defects
fileHeaders=ID,Issue Key,Fields 

如果我通过"Organization",则区域对象值应基于此值。同样在解组源时。

现在我得到区域列表和SourceTypes列表,然后通过检查值获取相应的对象。

可能有没有办法只根据属性值解析选中的一个而不是获取列表然后检查值并返回对象?

0 个答案:

没有答案