一个XSD,两个代码生成工具,两个命名空间(One XSD, two code generation

2019-07-30 10:27发布

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

我先按照我的地方居住类我的C#的命名空间设置命名空间的XSD。 生成(与Microsoft工具)工作正常,也序列化的伟大工程,我能validat他们对XSD - 完美。

现在,我想与JAXB创建的Java类。 的问题是,这将要创建的类具有然后不同的封装结构中的一个在C#。 所以,当我XSD命名设置为Java的封装结构,它工作正常。 我可以序列化和验证XML。

现在我的问题(S):有没有解决这个问题的方法吗? (有两种生成工具一个XSD)我缺乏实际需要的命名空间有什么认识?

谢谢

编辑:既然它似乎有一个missunderstanding,我添加了一个例子

XSD:目标名称= “http://foo.bar/mySubNs/model”

  • C#Modelnamespace:com.foo.mySubNs.model(其适合的XSD命名空间)中的所有生成的类将有虽然MS代码生成中提供的相同的命名空间
  • 爪哇Modelnamespace:com.foo.myOtherSubNs.model(从XSD命名空间不同)生成的类将有“C#命名空间”。 因此,该班将无法编译。

如果我的代码生成过程中更改命名空间对于Java,我可以编译的类。 到现在为止还挺好。 但我不会能够通过对XSD的Java类,以验证生成的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"));

要我在Ant构建脚本使用XJC任务模式构建Java类:

<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>

Answer 1:

XSD命名没有相匹配的封装结构,至少不是在Java中。 当使用JAXB只是提供包装生成的类你想放的类之中。



Answer 2:

XSD,C#或Java代码:以什么样的模式是主要一个你必须考虑你的选择。 一旦你做出这样的选择,你必须让其他两个变化,因为它们可能。 最好的选择是让你的XSD参考模型,生成各自的工具,这两种语言的代码,而只是接受的结果。

您也可以尝试挑选XML命名空间,使得在两端的代码将是令人满意的,但不要试图强迫任何内容到最后一个字母。 这不是它的意思是如何工作的。



文章来源: One XSD, two code generation tools, two namespaces