java - 使用 jaxb 解析包装属性

标签 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 路线。

最佳答案

你需要稍微修改你的根类, 这样它将包含 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 已经有一个 built-in converter之间java.util.UUIDString .

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>

还有这个main重现原始 XML 的方法:

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);
}

关于java - 使用 jaxb 解析包装属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44854385/

相关文章:

Java JAXB 如何将 XmlElements 重新定义为现有变量

java - HttpPost 响应不返回 json 对象

java - 犀牛嵌入

java - 从文本文件中读取整数并存储到数组中

java - 使用 JAXB 将具有类似映射结构的 xml 解码为对象

java - JAXB 解码返回 'URI is not absolute' 错误

java - 未以管理员身份登录时在 MySQL 驱动程序中获取 CommunicationsException

Java:SAX 解析一个巨大的 XML 文件

java - 将不匹配的数据模型从 XML 转换为 JSON 的最佳实践

xml - 如何在perl中使用xpath分割xml?