我有一个定义元素和属性默认值的架构。我正在尝试使用基于该架构的JAXB解析文档,但是JAXB没有设置默认值。关于如何使JAXB接受模式中的默认值的任何想法?
example.xsd:
<?xml version="1.0" encoding="UTF-8"?><xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/example"
xmlns:tns="http://www.example.org/example">
<xs:element name="root" type="tns:rootType"/>
<xs:complexType name="rootType">
<xs:sequence>
<xs:element name="child" type="tns:childType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="childType">
<xs:sequence>
<xs:element name="childVal" type="xs:string" default="defaultElVal"/>
</xs:sequence>
<xs:attribute name="attr" type="xs:string" default="defaultAttrVal"/>
</xs:complexType>
example1.xml
<?xml version="1.0" encoding="UTF-8"?>
<tns:root xmlns:tns="http://www.example.org/example" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/example example.xsd ">
<child>
<childVal/>
</child>
</tns:root>
TestParser.java
package test;
import java.io.File;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.validation.Schema;
import javax.xml.validathtml" target="_blank">ion.SchemaFactory;
public class TestParser {
public static void main(String[] pArgs) {
try {
JAXBContext context = JAXBContext.newInstance(RootElement.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
SchemaFactory schemaFac = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema sysConfigSchema = schemaFac.newSchema(
new File("example.xsd"));
unmarshaller.setSchema(sysConfigSchema);
RootElement root = (RootElement)unmarshaller.unmarshal(
new File("example1.xml"));
System.out.println("Child Val: " + root.getChild().getChildVal());
System.out.println("Child Attr: " + root.getChild().getAttr());
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
RootElement.java
package test;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="root", namespace="http://www.example.org/example")
public class RootElement {
private ChildEl child;
public RootElement() {}
public ChildEl getChild() {
return child;
}
public void setChild(ChildEl pChild) {
this.child = pChild;
}
}
ChildEl.java
package test;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="child")
public class ChildEl {
private String attr;
private String childVal;
public ChildEl() {};
@XmlAttribute
public String getAttr() {
return attr;
}
public void setAttr(String pAttr) {
this.attr = pAttr;
}
public String getChildVal() {
return childVal;
}
public void setChildVal(String pVal) {
this.childVal = pVal;
}
}
元素默认值
要获取element属性的默认值,您需要对其进行如下注释:
@XmlElement(defaultValue="defaultElVal")
public String getChildVal() {
return childVal;
}
属性默认值
如果使用EclipseLink
JAXB(MOXy)
,则将使用提供的代码获得默认属性值。Metro的JAXB实施中可能存在一个错误,阻止了此工作。注意我领导了MOXy的实现。
替代方法
以下代码应可用于任何JAXB实现,而无需对模型进行任何代码更改。您可以执行以下操作并利用SAXSource:
import java.io.File;
import java.io.FileInputStream;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
public class TestParser {
public static void main(String[] pArgs) {
try {
JAXBContext context = JAXBContext.newInstance(RootElement.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
SchemaFactory schemaFac = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema sysConfigSchema = schemaFac.newSchema(
new File("example.xsd"));
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setSchema(sysConfigSchema);
XMLReader xmlReader = spf.newSAXParser().getXMLReader();
SAXSource source = new SAXSource(xmlReader, new InputSource(new FileInputStream("example1.xml")));
RootElement root = (RootElement)unmarshaller.unmarshal(
source);
System.out.println("Child Val: " + root.getChild().getChildVal());
System.out.println("Child Attr: " + root.getChild().getAttr());
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
问题内容: 我在应用程序中看到,解析的XML文件中的xinclude在Java XSLT转换中不起作用。 但是,尽管我这样做: 我没有将变压器工厂专门设置为返回“ null”。 我的问题:默认的Java(1.6或6)是否支持xinclude,还是必须添加替代的XSLT解析器(如Apache Xerces)? 问题答案: 根据规范,自Java 1.5(5)以来一直提供支持。我相信XInclude支持
问题内容: 我遇到了一些具有以下结构的Java代码: 我知道在C ++中,我可以为参数分配一个默认值。例如: Java是否支持这种语法?有什么理由使两步语法更可取? 问题答案: 我遇到了一些具有以下结构的Java代码: 我知道在C ++中,我可以为参数分配一个默认值。例如: Java是否支持这种语法?有什么理由使两步语法更可取?
问题内容: 因此,我希望将其转换为这样的Java代码: JAXB是否可能? 曾经看到一些WebService Client存根生成器正在执行此操作,但也许不确定axis2 Webservice。 问题答案: 的 JAXB(JSR-222) 规范没有盖产生快速失败逻辑到域模型。现在,一种常见的做法是以注释(或XML)的形式表示验证规则,并对它们进行验证。 Bean验证(JSR-303) 对此进行了标
nosql数据库具有无模式属性,因此我们可以向节点或关系添加任何字段/属性。但是如果我使用Spring数据作为框架,我必须预先定义节点和关系对象的字段。Spring数据Neo4j似乎不支持动态插入字段...是真的吗?
从python语言的API文档中,我找不到任何关于graph x的东西,这是否意味着它还不支持,如果现在不支持,它会支持吗?
我在查阅Spring Data Elasticsearch store的文档时,遇到了以下问题: 有关反应性支持的更多详细信息,请参阅特定于存储的留档。 虽然我已经在elasticsearch商店留档中,但我没有找到任何关于反应性支持的进一步信息。我在哪里可以找到关于这方面的进一步信息?