是否可以XML,适当XSD,选择maxOccurs = "1" 和每个元素minOccurs="1"?
whether there can be XML, appropriate XSD, having choice with maxOccurs = "1" and every elements with minOccurs="1"?
我有有效的XSD,但我不能使xml,适用它。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns="urn:hl7-org:v3" xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:hl7-org:v3"
elementFormDefault="qualified">
<xs:element name="Main" type="Main"/>
<xs:complexType name="Child1">
<xs:sequence>
<xs:element name="f1" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Child2">
<xs:sequence>
<xs:element name="f1" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Main">
<xs:sequence>
<xs:choice>
<xs:element name="child1" type="Child1"
nillable="true"
minOccurs="1"
maxOccurs="1"/>
<xs:element name="child2" type="Child2"
nillable="true"
minOccurs="1"
maxOccurs="1"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:schema>
如果这不可能,为什么架构有效?
使用 JAXB 为此模式生成源,创建对象,但验证未通过 -
[发现以元素 'child1' 开头的无效内容。此时不需要子元素。]
import cz.atria.common.datagenerator.ValueProvider;
import cz.atria.common.datagenerator.ValueProviderRandom;
import org.hl7.v3.Child1;
import org.hl7.v3.Main;
import org.hl7.v3.ObjectFactory;
import org.junit.Test;
import javax.xml.XMLConstants;
import javax.xml.bind.*;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import java.io.File;
public void test1() throws Exception {
JAXBContext jaxbContext = JAXBContext.newInstance(Main.class.getPackage().getName());
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new File("D:\cts2\jaxbtest\src\main\xsd\schema1.xsd"));
Marshaller marshaller = jaxbContext.createMarshaller();
ObjectFactory of = new ObjectFactory();
marshaller.setSchema(schema);
Main main = new Main();
Child1 child1 = new Child1();
child1.setF1("test");
main.setChild1(child1);
final ValidationEventHandler validationEventHandler = marshaller.getEventHandler();
marshaller.setEventHandler(new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent event) {
/*if(event.getLocator().getObject() instanceof Child1) {
return true;
} else {
return validationEventHandler.handleEvent(event);
}*/
return validationEventHandler.handleEvent(event);
}
});
System.out.println(marshaller.getEventHandler());
marshaller.marshal(main, System.out);
}
模式没有定义不可能的情况。以下任一文档应该(并且是)对该模式有效:
<tns:Main xmlns:tns="urn:hl7-org:v3">
<tns:child1><tns:f1>Hi, mom.</tns:f1></tns:child1>
</tns:Main>
<tns:Main xmlns:tns="urn:hl7-org:v3">
<tns:child2><tns:f1>Hi, dad.</tns:f1></tns:child2>
</tns:Main>
但总的来说,定义一组不能同时满足的约束(或者,如您所说,定义XML 个词汇,这是不可能的)。要求 XSD 处理器检测所有不可满足约束的情况会给实现带来严重的负担,而且现在任何人都不一定知道如何满足这种负担,更不用说满足可接受的性能了。
但是,如果您不明显地看出该模式是可满足的,那么您可能一直认为该模式的含义与其实际含义不同。由于您没有告诉我们任何相关信息,因此这里的任何人都无法帮助您提高理解力。祝你好运!
你的问题可能是什么
基于您问题中的相同代码,我假设您使用了如下所示的外部绑定文件来摆脱 JAXBElement
属性。
<jaxb:bindings
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0"
xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc">
<jaxb:globalBindings generateElementProperty="false">
<xjc:simple />
</jaxb:globalBindings>
</jaxb:bindings>
这将为您提供如下所示的 Main
class:
@XmlRootElement(name = "Main")
public class Main {
@XmlElement(nillable = true)
protected Child2 child2;
@XmlElement(nillable = true)
protected Child1 child1;
...
}
这将产生如下所示的 XML,请注意 child2
和 child1
元素的存在:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Main xmlns="urn:hl7-org:v3">
<child2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true"/>
<child1>
<f1>test</f1>
</child1>
</Main>
如何解决
您需要放回 JAXBElement
属性(以区分使用 xsi:nil="true"
编组的值表示 null,还是作为选择的一部分缺少节点)。这意味着您需要从外部绑定文件中删除 generateElementProperty="false"
。这将为您提供如下所示的 Main class:
@XmlRootElement(name = "Main")
public class Main {
@XmlElementRef(name = "child2", namespace = "urn:hl7-org:v3", type = JAXBElement.class, required = false)
protected JAXBElement<Child2> child2;
@XmlElementRef(name = "child1", namespace = "urn:hl7-org:v3", type = JAXBElement.class, required = false)
protected JAXBElement<Child1> child1;
...
}
这将生成 XML,如下所示,可以正确验证:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Main xmlns="urn:hl7-org:v3">
<child1>
<f1>test</f1>
</child1>
</Main>
我有有效的XSD,但我不能使xml,适用它。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns="urn:hl7-org:v3" xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:hl7-org:v3"
elementFormDefault="qualified">
<xs:element name="Main" type="Main"/>
<xs:complexType name="Child1">
<xs:sequence>
<xs:element name="f1" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Child2">
<xs:sequence>
<xs:element name="f1" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Main">
<xs:sequence>
<xs:choice>
<xs:element name="child1" type="Child1"
nillable="true"
minOccurs="1"
maxOccurs="1"/>
<xs:element name="child2" type="Child2"
nillable="true"
minOccurs="1"
maxOccurs="1"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:schema>
如果这不可能,为什么架构有效? 使用 JAXB 为此模式生成源,创建对象,但验证未通过 - [发现以元素 'child1' 开头的无效内容。此时不需要子元素。]
import cz.atria.common.datagenerator.ValueProvider;
import cz.atria.common.datagenerator.ValueProviderRandom;
import org.hl7.v3.Child1;
import org.hl7.v3.Main;
import org.hl7.v3.ObjectFactory;
import org.junit.Test;
import javax.xml.XMLConstants;
import javax.xml.bind.*;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import java.io.File;
public void test1() throws Exception {
JAXBContext jaxbContext = JAXBContext.newInstance(Main.class.getPackage().getName());
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new File("D:\cts2\jaxbtest\src\main\xsd\schema1.xsd"));
Marshaller marshaller = jaxbContext.createMarshaller();
ObjectFactory of = new ObjectFactory();
marshaller.setSchema(schema);
Main main = new Main();
Child1 child1 = new Child1();
child1.setF1("test");
main.setChild1(child1);
final ValidationEventHandler validationEventHandler = marshaller.getEventHandler();
marshaller.setEventHandler(new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent event) {
/*if(event.getLocator().getObject() instanceof Child1) {
return true;
} else {
return validationEventHandler.handleEvent(event);
}*/
return validationEventHandler.handleEvent(event);
}
});
System.out.println(marshaller.getEventHandler());
marshaller.marshal(main, System.out);
}
模式没有定义不可能的情况。以下任一文档应该(并且是)对该模式有效:
<tns:Main xmlns:tns="urn:hl7-org:v3">
<tns:child1><tns:f1>Hi, mom.</tns:f1></tns:child1>
</tns:Main>
<tns:Main xmlns:tns="urn:hl7-org:v3">
<tns:child2><tns:f1>Hi, dad.</tns:f1></tns:child2>
</tns:Main>
但总的来说,定义一组不能同时满足的约束(或者,如您所说,定义XML 个词汇,这是不可能的)。要求 XSD 处理器检测所有不可满足约束的情况会给实现带来严重的负担,而且现在任何人都不一定知道如何满足这种负担,更不用说满足可接受的性能了。
但是,如果您不明显地看出该模式是可满足的,那么您可能一直认为该模式的含义与其实际含义不同。由于您没有告诉我们任何相关信息,因此这里的任何人都无法帮助您提高理解力。祝你好运!
你的问题可能是什么
基于您问题中的相同代码,我假设您使用了如下所示的外部绑定文件来摆脱 JAXBElement
属性。
<jaxb:bindings
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0"
xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc">
<jaxb:globalBindings generateElementProperty="false">
<xjc:simple />
</jaxb:globalBindings>
</jaxb:bindings>
这将为您提供如下所示的 Main
class:
@XmlRootElement(name = "Main")
public class Main {
@XmlElement(nillable = true)
protected Child2 child2;
@XmlElement(nillable = true)
protected Child1 child1;
...
}
这将产生如下所示的 XML,请注意 child2
和 child1
元素的存在:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Main xmlns="urn:hl7-org:v3">
<child2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true"/>
<child1>
<f1>test</f1>
</child1>
</Main>
如何解决
您需要放回 JAXBElement
属性(以区分使用 xsi:nil="true"
编组的值表示 null,还是作为选择的一部分缺少节点)。这意味着您需要从外部绑定文件中删除 generateElementProperty="false"
。这将为您提供如下所示的 Main class:
@XmlRootElement(name = "Main")
public class Main {
@XmlElementRef(name = "child2", namespace = "urn:hl7-org:v3", type = JAXBElement.class, required = false)
protected JAXBElement<Child2> child2;
@XmlElementRef(name = "child1", namespace = "urn:hl7-org:v3", type = JAXBElement.class, required = false)
protected JAXBElement<Child1> child1;
...
}
这将生成 XML,如下所示,可以正确验证:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Main xmlns="urn:hl7-org:v3">
<child1>
<f1>test</f1>
</child1>
</Main>