用jaxb解析包装属性

时间:2017-06-30 20:28:16

标签: java xml jaxb

给出类似的东西:

<root>
    <wrapper>
        <wrapped id="..."/>
        <wrapped id="..."/>
    </wrapper>
</root>

如何将其映射到此POJO:

public class Root {
    public Set<UUID> myIds = new LinkedHashSet();
}

我想知道,因为@XmlElement( name = "wrapped" ) @XmlElementWrapper( name = "wrapper" )的工作方式与我想要的有些相似,是否有东西可以获得属性?

注意:我没有使用moxy,据我所知,我不能使用xpaths。我试图避开@XmlJavaTypeAdapter路线。

1 个答案:

答案 0 :(得分:0)

您需要稍微修改一下根类, 这样它就会包含Set<Wrapped>而不是Set<UUID>

@XmlRootElement(name = "root")
public class Root {

    @XmlElementWrapper(name = "wrapper")
    @XmlElement(name = "wrapped")
    public Set<Wrapped> myWrappeds = new LinkedHashSet<>();
}

你需要一个单独的<wrapped>元素类 令我惊讶的是,您不需要@XmlJavaAdapter id,因为JAXB在java.util.UUIDString之间已经有built-in converter

public class Wrapped {

    @XmlAttribute(name = "id")
    public UUID id;
}

我已使用此XML输入文件检查了上述内容

<root>
    <wrapper>
        <wrapped id="550e8400-e29b-11d4-a716-446655440000"/>
        <wrapped id="550e8400-e29b-11d4-a716-446655440001"/>
    </wrapper>
</root>

和这个再现原始XML的main方法:

public static void main(String[] args) throws Exception {
    JAXBContext context = JAXBContext.newInstance(Root.class);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    File file = new File("root.xml");
    Root root = (Root) unmarshaller.unmarshal(file);
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(root, System.out);
}