【问题标题】:Parsing wrapped attributes with jaxb使用 jaxb 解析包装的属性
【发布时间】:2017-12-04 21:09:31
【问题描述】:

鉴于类似:

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

【问题讨论】:

标签: java xml jaxb


【解决方案1】:

你需要稍微修改你的根类, 这样它将包含Set&lt;Wrapped&gt; 而不是Set&lt;UUID&gt;

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

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

您需要为 &lt;wrapped&gt; 元素创建一个单独的类。
令我惊讶的是,您在这里不需要为id 提供@XmlJavaAdapter,因为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>

还有这个 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);
}

【讨论】:

  • 您好,感谢您抽出宝贵时间对此进行调查。获取Set&lt;UUID&gt; 而不是Set&lt;Wrapped&gt; 是我正在寻找的,因此无需编写代码来在UUIDWrapped 对象之间进行转换。现在我基本上使用你所拥有的 + @XmlJavaAdapter 来进行 UUIDWrapped 对象之间的转换,所以 pojo 仍然有 Set&lt;UUID&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
相关资源
最近更新 更多