将嵌套的 xml 标记编组为多个单独的标记

Marshalling the nested xml tags into multiple separate tags

提问人:Rock 提问时间:9/30/2022 更新时间:9/30/2022 访问量:92

问:

我有一个来自 api 的 XML 响应,类似于

<RootElement>
    <Account>
     <Address>
      <Name>xyz</Name>
     </Address>
     <Address>
      <Name>abc</Name>
     </Address>
    </Account>
    <Account>
     <Address>
      <Name>def</Name>
     </Address>
     <Address>
      <Name>pqr</Name>
     </Address>
   </Account>
</RootElement>

以及上述表示的相应 Java 类

@XmlRootElement(name="RootElement")
class RootElement {
  
  @XmlElement(name="Account")
  List<Account> account;

//corresponding getter and setter method
}
@XmlRootElement(name="Account")
class Account {

 @XmlElement(name="Address")
 List<Address> address;

//corresponding getter and setter method
}
@XmlRootElement(name="Address")
class Address {

 @XmlElement(name="Name")
 String name;

//corresponding getter and setter method

}

在这里,我想将来自API的XML响应编入此结构

<RootElement>
    <Account>
     <Address>
      <Name>xyz</Name>
     </Address>
    </Account>
    <Account>
     <Address>
      <Name>abc</Name>
     </Address>
    </Account>
    <Account>
     <Address>
      <Name>def</Name>
     </Address>
   </Account>
   <Account>
     <Address>
      <Name>pqr</Name>
     </Address>
   </Account>
</RootElement>

为了编组 Java 对象,这是我添加的代码

JAXBContext context = JAXBContext.newInstance(CreateExemptionCertificate.class);
    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
    StringWriter sw = new StringWriter();
    m.marshal(cc, sw);

    String result = sw.toString();

我想将内部 Address 标签拆分为多个 Account 标签。 如何在 Java 中实现这一点,我尝试了编组,但无法形成所需的 XML 结构。

Java XML XML 解析 JAXB

评论

0赞 Michal 9/30/2022
您需要创建新的 RootElement 实例,这将遵循您的要求,即对于每个内部地址,您将创建一个帐户/地址对。您将序列化转换的结果。
0赞 Rock 9/30/2022
@Michal意思是喜欢循环遍历每个 Account 对象并根据 Address 对象的数量创建新实例?
0赞 Michal 9/30/2022
我会将现有的 RootObjects 复制到新的 RootObject 中。是的,在复制过程中,我会以符合您要求的方式设置帐户/地址成员。我的猜测是,在复制原始对象时,这更容易完成。当然,如果您设法就地(在原始对象上)执行此操作并且不需要原始对象,那也可以。
0赞 Rock 9/30/2022
我想以这样一种方式操作现有的 RootElement 对象,即它根据 Address 对象的数量创建新的 Account 对象,而不是完全创建另一个 RootElement 对象。你能引导我找到任何这样的链接或参考资料吗?
0赞 Michal 9/30/2022
我不认为这个问题在某处被描述过。正如我所说,这是可以做到的,但使用复制方法要容易得多。我想你必须自己弄清楚其中之一。

答: 暂无答案