【问题标题】:Generating C# classes from XML schema that use JAXB (Java Architecture for XML Binding)从使用 JAXB(用于 XML 绑定的 Java 架构)的 XML 模式生成 C# 类
【发布时间】:2010-02-05 22:45:14
【问题描述】:

我有许多使用 JAXB(用于 XML 绑定的 Java 架构)标记的 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 名称的类,但会序列化为单字符架构中指定的元素/属性。

例如

[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; }
    }
}

是否有任何合理的途径可以实现这一目标?

【问题讨论】:

    标签: c# schema xsd jaxb


    【解决方案1】:

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

    1. 在 xsd 本身中,就像您在问题中提出的那样。
    2. 在工具使用的单独 xml 文件中。
    3. 在 java 类本身的注释中。

    所有这些方式在语义上都是等价的——所以严格来说, 标签不是 xsd 契约的一部分。可以使用上面的选项 2. 或 3. 来构造略有不同的 java 代码,但具有相同的 xsd 和 wsdl 合约。

    我希望 .NET 端的工具集中存在类似的机制。建议你查一下xsd.exe的参考资料和相关资料,看看有哪些支持自定义生成代码(抱歉帮不上忙,我不熟悉这个工具)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 2016-10-06
        • 1970-01-01
        • 2019-11-08
        相关资源
        最近更新 更多