我有一个XSD文件,我也想从中生成C#和Java类。
我首先根据我的类所在的C#名称空间在XSD中设置名称空间。生成(使用Microsoft工具)效果很好,并且序列化效果很好,我可以针对XSD对其进行验证- 完美。
现在,我想用JAXB创建Java类。问题在于将要创建的类与C#中的类具有不同的包结构。因此,当我将XSD名称空间设置为java的包结构时,它可以正常工作。我可以序列化和验证XML。
现在我的问题是:有办法解决这个问题吗?(两个生成工具都具有一个XSD)我是否对名称空间的实际用途缺乏了解?
谢谢
编辑:由于似乎有一个误会,我添加了一个示例
**XSD:targetNamespace =“ http://foo.bar/mySubNs/model”**
如果在Java代码生成期间更改命名空间,则可以编译这些类。到目前为止,一切都很好。但是由于命名空间不同,我将无法通过该Java类针对XSD验证生成的XML。
为了用Java编组对象,我使用JAXB像这样:
ValidationEventCollector validationCollector = new ValidationEventCollector(); SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = schemaFactory.newSchema(new File ("my/schema/location")); // JAXB_CONTEXT is just an instance of "JAXBContext" Marshaller marshaller = JAXB_CONTEXT.createMarshaller(); marshaller.setSchema(schema); marshaller.setEventHandler(validationCollector); marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); JAXBElement<MyClass> root = new JAXBElement<MyClass> ( new QName(MyClass.class.getPackage().getName(),"MyClass"),MyClass.class, node); marshaller.marshal(root, new File("output/Path/obj.xml"));
要从模式构建Java类,请在ant构建脚本中使用xjc-task:
<xjc destdir="${dir.src.gen}" removeOldOutput="no" extension="true"> <schema dir="${dir.schema}" includes="${file.schema}"/> <binding dir="${dir.schema}" includes="*.xjb"/> <produces dir="${dir.src.gen}" includes="**/*.java"/> </xjc>
XSD名称空间不必匹配包结构,至少在Java中不需要。使用JAXB生成类时,只需提供要放入类的包即可。