- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个带有注释 nillable=true 的变量的类,我不希望它们出现在 xml 中。该类是从无法更改的 xsd 生成的。
例子:一个看起来像这样的类:
public class Hi {
...
@XmlElement(name = "hello", nillable = true)
protected Long hello;
...
}
对象被 JAXBContext 创建的编码器编码。生成的xml变成:
...
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
...
Hi 类是从无法更改的 xsd 生成的。我的问题是,如果“hello”为空,是否有办法让编码器忽略可空参数并且不向 xml 输出任何内容?
最佳答案
一种方法是实现 decorator XMLStreamWriter
类型并在其中实现您的过滤器。
这是一个非常基本和幼稚的(它没有涵盖很多东西,比如命名空间和许多其他东西),它可以适用于你的情况,但它并不意味着完美,它只是为了展示想法:
public class FilteredXMLStreamWriter implements XMLStreamWriter {
private final XMLStreamWriter writer;
private final Set<String> pathsToSkip;
private final Stack<String> path = new Stack<>();
private boolean ignore;
public FilteredXMLStreamWriter(XMLStreamWriter writer, Set<String> pathsToSkip) {
this.writer = writer;
this.pathsToSkip = pathsToSkip;
}
/**
* Build the current path from the Stack
*/
private String toPath() {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String element : path) {
if (first) {
first = false;
} else {
sb.append('/');
}
sb.append(element);
}
return sb.toString();
}
public void writeStartElement(String prefix, String localName, String namespaceURI)
throws XMLStreamException {
// Add the current
path.push(localName);
if (!ignore) {
this.ignore = pathsToSkip.contains(toPath());
if (!ignore) {
this.writer.writeStartElement(prefix, localName, namespaceURI);
}
}
}
...
public void writeEndElement() throws XMLStreamException {
if (ignore) {
this.ignore = !pathsToSkip.contains(toPath());
} else {
this.writer.writeEndElement();
}
path.pop();
}
...
public void writeCharacters(String text) throws XMLStreamException {
if (!ignore) {
this.writer.writeCharacters(text);
}
}
public void writeCharacters(char[] text, int start, int len)
throws XMLStreamException {
if (!ignore) {
this.writer.writeCharacters(text, start, len);
}
}
...
}
这是一种让路径跳过的简单方法:
private static Set<String> pathsToSkip(Class<?> clazz) {
// Make sure that the class is annotated with XmlRootElement
XmlRootElement rootElement = clazz.getAnnotation(XmlRootElement.class);
if (rootElement == null) {
throw new IllegalArgumentException("XmlRootElement is missing");
}
// Create the root name from the annotation or from the class name
String rootName = ("##default".equals(rootElement.name()) ?
clazz.getSimpleName().substring(0, 1).toLowerCase() + clazz.getSimpleName().substring(1) :
rootElement.name());
// Set that will contain all the paths
Set<String> pathsToSkip = new HashSet<>();
addPathsToSkip(rootName, clazz, pathsToSkip);
return pathsToSkip;
}
private static void addPathsToSkip(String parentPath, Class<?> clazz,
Set<String> pathsToSkip) {
// Iterate over all the fields
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
XmlElement xmlElement = field.getAnnotation(XmlElement.class);
if (xmlElement != null) {
// Create the name of the element from the annotation or the field name
String elementName = ("##default".equals(xmlElement.name()) ?
field.getName() :
xmlElement.name());
String path = parentPath + "/" + elementName;
if (xmlElement.nillable()) {
// It is nillable so we add it to the paths to skip
pathsToSkip.add(path);
} else {
// It is not nillable so we check the fields corresponding
// to the field type
addPathsToSkip(path, field.getType(), pathsToSkip);
}
}
}
}
然后这里是你将如何调用它:
marshaller.marshal(
myObject,
new FilteredXMLStreamWriter(
XMLOutputFactory.newInstance().createXMLStreamWriter(sw),
pathsToSkip(Hi.class)
)
);
关于java - JAXB 编码,忽略 nillable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39204125/
有没有办法让 JAXB 正确打印 xmlns:xsi和 xsi:nill在 nillable @XmlRootElement ? public class XmlValueTest { pub
我有一个客户要求我的 required字符串元素有 nillable="false" , 目前 wsdl 中的所有字符串都会nillable="true" 出来, IE: 我该如何更改 nillab
为了避免值被包裹在 JAXBElement ,我使用以下绑定(bind)文件从 XSD 生成类: 但是,nillable 有问题。字段。对于以下 XSD:
我有一个无法修改的简单XSD(由第三方提供)。我正在尝试使用 XJC 为 XSD 生成 java 类。非常简化的 XSD 是: 我想将一个对象编码为 XML,以便将元素设置为 nil。当我
我使用 JAXB 2.2.4 生成具有以下绑定(bind)文件的 Java 代码: 不幸的是,生成的代码有一个 nillable = true 注释。请参阅以下示例: @XmlElement(n
对于我的 Web 服务请求,我想区分请求的 null 值和缺少的标记。换句话说,我需要以下元素定义: 我开发了 web 服务代码优先,所以我使用 JAXBElementRef 定义了元素: @Xml
我有一个带有注释 nillable=true 的变量的类,我不希望它们出现在 xml 中。该类是从无法更改的 xsd 生成的。 例子:一个看起来像这样的类: public class Hi {
我正在努力获取一个 xml 文件以根据 XSD 架构进行验证,但我在验证时遇到了问题。每次我验证时都会收到错误提示 “模式有效性错误:元素‘{http://services.website.com/P
我刚和我的同事发现了一个关于 JAXB 的奇怪案例。 我用 @XmlElement(required = true) 声明了一个字段,默认为 nillable = false。 但我无意中试图编码一个
我正在创建一个 Web 服务并与 Axis2 生成契约(Contract)(WSDL),就像 POJO Web 服务一样,这反过来又给我这样的输出 而所需的是这个 是否有任何注释可以让我做到这一点
我正在重构一些代码以使用 JAXB 和反射将代码输出到客户端,它目前正在使用 XMLWriter 并且每次都手动创建标签。 我遇到的问题是,由于客户端的限制,对于 java 类中的任何空字段,我需要在
的文档 required 说: If required() is true, then Javabean property is mapped to an XML schema element dec
我反复将元素设置为 minOccurs="0" 和 nillable="true"。 我正在阅读 this文章和现在在我的 WSDL 中,我不确定同时使用两者是否值得。这篇文章提供了一个很好的示例来表
在我的 wsdl 中我有一个元素: 我知道 nillable true 允许空值,这是否意味着它可以允许 xml 空标记?即 最佳答案 设置nillable="true"意味着 标记可以如下所示:
这是我想根据以下 XML 架构验证的 xml 文件。 0123987654 In front of PNB 2002-09-24 XML 架构 在验证过程中,虽然
相当于什么 从 XML 到 JAVA?我正在研究 SOAP,所以我不得不问。 还有类似的元素 Java 中的对象需要这些吗?或者我可以直接为它们分配空值吗? 最佳答案 在 Java 中,没有像
Java 类 @XmlElement(nillable = true) 中的变量前面是什么意思。是不是说xml中的字段是可选的? 例如:@XmlElement(nillable = true) pro
这是一个错误吗? 我的 xsd 架构中需要 nillable = "true"。从我的 java 代码生成这样一个元素的唯一方法是使用 @XmlElement(nillable = true),对吗?
我正在使用 JAX-WS 创建 Web 服务。它是使用 sun-jaxws.xml 从 @WebService 带注释的类创建的。 我对某些字段有一个新要求,既可选又可为空。对于这样的字段,如果传递了
目前我正在使用 javax.xml.validation.Validator 来根据给定的 xsd 验证 xml。 Sample xsd: xml : 在上面的例子
我是一名优秀的程序员,十分优秀!