一个XSD,两个代码生成工具,两个名称空间

问题描述

XSD名称空间不必匹配包结构,至少在Java中不需要。使用JAXB生成类时,只需提供要放入类的包即可。

解决方法

我有一个XSD文件,我也想从中生成C#和Java类。

我首先根据我的类所在的C#名称空间在XSD中设置名称空间。生成(使用Microsoft工具)效果很好,并且序列化效果很好,我可以针对XSD对其进行验证-
完美。

现在,我想用JAXB创建Java类。问题在于将要创建的类与C#中的类具有不同的包结构。因此,当我将XSD名称空间设置为java的包结构时,它可以正常工作。我可以序列化和验证XML。

现在我的问题是:有办法解决这个问题吗?(两个生成工具都具有一个XSD)我是否对名称空间的实际用途缺乏了解?

谢谢

编辑:由于似乎有一个误会,我添加了一个示例

**XSD:targetNamespace =“ http://foo.bar/mySubNs/model”**

  • C#Modelnamespace:com.foo.mySubNs.model(适合XSD命名空间),所有生成的类将具有通过MS代码提供的相同命名空间
  • Java Modelnamespace:com.foo.myOtherSubNs.model(与XSD命名空间不同),生成的类将具有“ C#命名空间”。结果,这些类将无法编译。

如果在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>