c# - 一个 XSD、两个代码生成工具、两个命名空间

标签 c# java xsd jaxb codegen

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

我首先根据类所在的 C# 命名空间在 XSD 中设置命名空间。生成(使用 Microsoft 工具)运行良好,序列化也运行良好,我可以根据 XSD 验证它们 - 完美。

现在我想使用 JAXB 创建 java 类。 问题是要创建的类具有与 C# 中不同的包结构。所以当我将XSD命名空间设置为java的包结构时,它工作得很好。我可以序列化并验证 XML。

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

谢谢

编辑:由于似乎存在误解,所以我添加了一个示例

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

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

如果我在 java 代码生成期间更改 namespace ,我可以编译这些类。到目前为止,一切都很好。但我无法根据 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"));

为了从模式构建我的 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 生成类时,只需提供要将类放入其中的包。

关于c# - 一个 XSD、两个代码生成工具、两个命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11503097/

相关文章:

xml - XML 文档的第一行是什么?

c# - 我需要固定匿名代表吗?

c# - 将类型库导入为 C# 代码的工具

java - 在一个 Java 文件中一个接一个地运行程序

java - 无法从 okhttp 导入请求和响应类

java - 如何从包含 MSFT 序列化 : GUID datatypes? 的 XSD 生成 Java 代码

c# - 如何在 TextBox Multiline 中选择行号

c# - 带有包含字典的参数的 Api Controller 中的 JSON.Net 始终为空

java - 我是否错误地使用了包?

java - org.xml.sax.SAXParseException : cvc-complex-type. 2.4.c: 匹配的通配符是严格的