从使用JAXB的XML模式生成C#类(用于XML绑定的Java体系结构)

时间:2010-01-21 15:17:25

标签: c# schema xsd jaxb

我有许多使用JAXB(Java Architecture for XML Binding)标记的XML模式,类似于以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="1.0">
  <xs:element name="H">
    <xs:annotation>
      <xs:appinfo>
        <jxb:class name="Header" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="X" minOccurs="1" maxOccurs="1">
          <xs:annotation>
            <xs:appinfo>
              <jxb:property name="SessionControl"/>
            </xs:appinfo>
          </xs:annotation>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="X" type="xs:string">
    <xs:annotation>
      <xs:appinfo>
        <jxb:class name="SessionControl"/>
      </xs:appinfo>
    </xs:annotation>
  </xs:element>
</xs:schema>

从这些我需要生成C#类。

在上面的架构上运行xsd.exe会生成以下内容(为清晰起见,删除了一些属性):

[XmlRoot(Namespace = "", IsNullable = false)]
public partial class H
{
    private string xField;

    public string X
    {
        get { return this.xField; }
        set { this.xField = value; }
    }
}

显然这不太理想 - 我需要考虑架构中的jxb:classjxb:property标记,为我提供一个使用更易读的jxb名称的类,但是序列化为模式中指定的单字符元素/属性。

e.g。

[XmlRoot(Namespace = "", IsNullable = false, ElementName = "H")]
public partial class Header
{
    private string xField;

    [XmlElement(ElementName = "X")]
    public string SessionControl
    {
        get { return this.xField; }
        set { this.xField = value; }
    }
}

有没有合理的途径来实现这个目标?

2 个答案:

答案 0 :(得分:2)

我知道在java方面,有可能以三种不同的方式告诉jaxb处理器额外的绑定信息:

  1. 在你问题中提到的xsd本身。
  2. 在该工具使用的单独xml文件中。
  3. 关于java类本身的注释。
  4. 所有这些方式在语义上都是等价的 - 严格来说,&lt; jxb&gt;标签不是xsd合同的一部分。可以使用上面的选项2.或3.来构建稍微不同的Java代码,但使用相同的xsd和wsdl契约。

    我希望.NET端的工具集中存在类似的机制。我建议你查找xsd.exe的参考资料和相关信息,看看有什么支持自定义生成的代码(对不起,我不能帮助更多,我不熟悉这个工具)。

答案 1 :(得分:0)

我们最终使用的方法是手动完成工作 - 从xsd.exe生成的C#源代码,使用xsd文件作为参考。