gpt4 book ai didi

xml - 如何在解码期间使用 JAXB XmlAdapter 处理 XML IDREF 的前向引用?

转载 作者:数据小太阳 更新时间:2023-10-29 02:04:13 25 4
gpt4 key购买 nike

是否可以在解码过程中处理 JAXB XmlAdapter 中 XML IDREF 元素的前向引用?例如,我有以下 XML complexType:

<xs:complexType name="person">
<xs:complexContent>
<xs:sequence>
<xs:element name="dateOfBirth" type="xs:dateTime" minOccurs="0"/>
<xs:element name="firstName" type="xs:string" minOccurs="0"/>
<xs:element name="gender" type="xs:string" minOccurs="0"/>
<xs:element name="guardian" type="xs:IDREF" minOccurs="0"/>
<xs:element name="homePhone" type="xs:string" minOccurs="0"/>
<xs:element name="lastName" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexContent>
</xs:complexType>

其中 guardian 字段可以引用文档其他地方的另一个 Person 类型的元素。我目前在编码时使用 XmlAdapter,以便第一次编码对象时,它通过包含编码,并且该对象的任何后续出现都通过引用编码。参见 mine 的上一个问题.但是,由于我的 XML 实例文档的创建方式,Person 元素的第一次出现可能发生在 IDREF 出现之后。

这是可能的吗?或者我需要以不同的方式处理这个问题吗?谢谢!

最佳答案

我对你的related question有一个答案我概述了如何使用 XmlAdapter 来实现对象的第一次出现通过包含/嵌套进行编码并且所有其他事件通过引用进行编码的用例:

选项 #1 - @XmlID/@XmlIDREF

如果你所有的Person对象都是通过嵌套表示的,并且你想引入一些基于键的关系那么你最好使用@XmlID来标记一个字段/属性作为键,@XmlID 将字段/属性映射为外键。您的 Person 类看起来像这样:

@XmlAccessorType(XmlAccessType.FIELD)
public class Person {

@XmlID
private String id;

@XmlIDREF
private Person guardian;
}

更多信息

选项 #2 - 使用 XmlAdapter

如果您从我的 previous answer 更新了 XmlAdapter成为:

package forum7587095;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class PhoneNumberAdapter extends XmlAdapter<PhoneNumberAdapter.AdaptedPhoneNumber, PhoneNumber>{

private List<PhoneNumber> phoneNumberList = new ArrayList<PhoneNumber>();
private Map<String, PhoneNumber> phoneNumberMap = new HashMap<String, PhoneNumber>();

@XmlSeeAlso(AdaptedWorkPhoneNumber.class)
@XmlType(name="phone-number")
public static class AdaptedPhoneNumber {
@XmlAttribute public String id;
public String number;

public AdaptedPhoneNumber() {
}

public AdaptedPhoneNumber(PhoneNumber phoneNumber) {
id = phoneNumber.getId();
number = phoneNumber.getNumber();
}

public PhoneNumber getPhoneNumber() {
PhoneNumber phoneNumber = new PhoneNumber();
phoneNumber.setId(id);
phoneNumber.setNumber(number);
return phoneNumber;
}

}

@XmlType(name="work-phone-number")
public static class AdaptedWorkPhoneNumber extends AdaptedPhoneNumber {

public String extension;

public AdaptedWorkPhoneNumber() {
}

public AdaptedWorkPhoneNumber(WorkPhoneNumber workPhoneNumber) {
super(workPhoneNumber);
extension = workPhoneNumber.getExtension();
}

@Override
public WorkPhoneNumber getPhoneNumber() {
WorkPhoneNumber phoneNumber = new WorkPhoneNumber();
phoneNumber.setId(id);
phoneNumber.setNumber(number);
phoneNumber.setExtension(extension);
return phoneNumber;
}
}

@Override
public AdaptedPhoneNumber marshal(PhoneNumber phoneNumber) throws Exception {
AdaptedPhoneNumber adaptedPhoneNumber;
if(phoneNumberList.contains(phoneNumber)) {
if(phoneNumber instanceof WorkPhoneNumber) {
adaptedPhoneNumber = new AdaptedWorkPhoneNumber();
} else {
adaptedPhoneNumber = new AdaptedPhoneNumber();
}
adaptedPhoneNumber.id = phoneNumber.getId();
} else {
if(phoneNumber instanceof WorkPhoneNumber) {
adaptedPhoneNumber = new AdaptedWorkPhoneNumber((WorkPhoneNumber)phoneNumber);
} else {
adaptedPhoneNumber = new AdaptedPhoneNumber(phoneNumber);
}
phoneNumberList.add(phoneNumber);
}
return adaptedPhoneNumber;
}

@Override
public PhoneNumber unmarshal(AdaptedPhoneNumber adaptedPhoneNumber) throws Exception {
PhoneNumber phoneNumber = phoneNumberMap.get(adaptedPhoneNumber.id);
if(null != phoneNumber) {
if(adaptedPhoneNumber.number != null) {
phoneNumber.setNumber(adaptedPhoneNumber.number);
}
return phoneNumber;
}
phoneNumber = adaptedPhoneNumber.getPhoneNumber();
phoneNumberMap.put(phoneNumber.getId(), phoneNumber);
return phoneNumber;
}

}

然后您将能够解码 XML 文档,如下所示,其中引用首先发生:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
<phone-number id="A"/>
<phone-number id="B">
<number>555-BBBB</number>
</phone-number>
<phone-number id="A">
<number>555-AAAA</number>
</phone-number>
<phone-number xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="work-phone-number" id="W">
<number>555-WORK</number>
<extension>1234</extension>
</phone-number>
<phone-number xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="work-phone-number" id="W"/>
</customer>

关于xml - 如何在解码期间使用 JAXB XmlAdapter 处理 XML IDREF 的前向引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7617163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com