当前位置: 首页 > 面试题库 >

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

袁运锋
2023-03-14
问题内容

我有一个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>

问题答案:

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



 类似资料:
  • 这里有两个xsd定义,它们几乎90%相似。下面是第一个xsd的框架: 第二个xsd是: 现在,这两个XSD在两个不同的包中生成两组类。我正在使用JAXB来解组收到的XML。XML是从这两个XSD生成的。 在创建JAXB上下文时,它给我带来了错误,因为我相信大多数类都会导致冲突。 下面是错误跟踪: 如果有人能给我提出任何解决方案,那就太好了。 谢谢

  • 我有一个采访问题-C#,是否可以在一个类中实现,从接口继承有两个具有相同名称和相同签名的方法?

  • 新安装Eclipse Mars.1,从市场上安装代号一,新安装运行在OSX 10.9.4上的Java1.8。 Eclipse和项目本身设置为在所有编译中使用Java1.8,我还更改了构建中的设置。xml将1.8设置为要使用的版本。 当我试图通过右键单击项目标题并选择“新建/其他”并选择gui builder来添加gui builder页面时,请单击“下一步” 在谷歌搜索错误,但与代号1无关。 任何

  • 本文向大家介绍手写代码:两个栈实现一个队列?相关面试题,主要包含被问及手写代码:两个栈实现一个队列?时的应答技巧和注意事项,需要的朋友参考一下 参考回答:  

  • 问题内容: 我正在尝试使用RSA 7.5和Websphere 7服务器开发IBM JAX_WS Web服务。因为我是一个初学者,所以我遵循Java类优先方法,即首先创建Java类,然后生成WSDL文件。 当我尝试创建wsdl文件时,出现异常: java.security.PrivilegedActionException:com.sun.xml.internal.bind.v2.runtime.I

  • 问题内容: 我正在用C#编写.NET Framework 3.5。 我正在尝试将某些Json解析为JObject。 Json如下: 当我尝试将此Json解析为JObject时,JObject仅了解LargeBox。SmallBox和MedBox的信息丢失。显然,这是因为它将“ TBox”解释为一个属性,并且该属性已被覆盖。 我从Delphi编码的服务中收到此Json。我正在尝试为该服务创建C#代理