gpt4 book ai didi

java - 如何根据 JAXB 中元素的存在分配 boolean 值?

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

这与this question有些相关和 this question这是我昨天问的。

我想使用 boolean 值来确定某个元素是否存在于 XML 文档中。我正在解析的文件允许使用以下元素:

<FamilyMember>
<Name>Jeff</Name>
</FamilyMember>
<FamilyMember>
<Name>Spot</Name>
<IsPet/>
</FamilyMember>

在此示例中,该元素指定 FamilyMember 是一只宠物,但没有与此元素关联的其他数据。我希望能够告诉 JAXB 根​​据该元素是否存在于已解析文件中返回一个 boolean 值。如果该元素存在,则该值应为真;否则,它应该是错误的。如果可能的话,我想从我用来生成我的 Java 类的 XSD 模式中做到这一点。

最佳答案

您应该能够使用类似于以下的 XmlAdapter 执行此操作:

一旦您得到 ( How do I specify the adapter(s) which JAXB uses for marshaling/unmarshaling data?) 的答案,您就可以应用适配器。


以下是如何完成的。请注意以下示例使用 EclipseLink JAXB (MOXy) 工作,但在使用 JAXB 引用实现时抛出异常。

家庭成员

package example;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement(name="FamilyMember")
public class FamilyMember {

private boolean pet;
private String name;

@XmlElementRef
@XmlJavaTypeAdapter(IsPetAdapter.class)
public boolean isPet() {
return pet;
}

public void setPet(boolean pet) {
this.pet = pet;
}

@XmlElement(name="Name")
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

IsPetAdapter

package example;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import forum204.IsPetAdapter.IsPet;

public class IsPetAdapter extends XmlAdapter<IsPet, Boolean> {

@Override
public Boolean unmarshal(IsPet v) throws Exception {
return null != v;
}

@Override
public IsPet marshal(Boolean v) throws Exception {
if(v) {
return new IsPet();
}
return null;
}

@XmlRootElement(name="IsPet")
public static class IsPet {
}

}

演示

package example;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(FamilyMember.class);

Unmarshaller unmarshaller= jc.createUnmarshaller();
FamilyMember fm = (FamilyMember) unmarshaller.unmarshal(new File("input.xml"));

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(fm, System.out);
}

}

关于java - 如何根据 JAXB 中元素的存在分配 boolean 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5969265/

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