我有许多使用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:class
和jxb: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; }
}
}
有没有合理的途径来实现这个目标?
答案 0 :(得分:2)
我知道在java方面,有可能以三种不同的方式告诉jaxb处理器额外的绑定信息:
所有这些方式在语义上都是等价的 - 严格来说,&lt; jxb&gt;标签不是xsd合同的一部分。可以使用上面的选项2.或3.来构建稍微不同的Java代码,但使用相同的xsd和wsdl契约。
我希望.NET端的工具集中存在类似的机制。我建议你查找xsd.exe的参考资料和相关信息,看看有什么支持自定义生成的代码(对不起,我不能帮助更多,我不熟悉这个工具)。
答案 1 :(得分:0)
我们最终使用的方法是手动完成工作 - 从xsd.exe生成的C#源代码,使用xsd文件作为参考。