将xml web服务数据对象转换为c#
本文关键字:转换 对象 数据 xml web 服务 | 更新日期: 2023-09-27 18:12:51
我有问题,为webService创建数据对象。我有wsdl文件。我正在寻找如何从下面的xml代码创建c#对象的方法。有什么软件可以自动完成吗?
<s:element name="ArrayOfProductRow">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="unbounded" name="PRODUCT" type="s:ProductRow" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="ProductRow">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="PRODUCT_INDEX" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="PRODUCT_CODE" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="PRODUCT_CATEGORY_INDEX" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="PRODUCT_PRICE_NET" type="s:double" />
<s:element minOccurs="1" maxOccurs="1" name="PRODUCT_VAT_RATE" type="s:double" />
<s:element minOccurs="1" maxOccurs="1" name="PRODUCT_NAME" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="PRODUCT_SHORT_DESCRIPTION" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="PRODUCT_LONG_DESCRIPTION" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="PRODUCT_ACTIVE" type="s:boolean" />
</s:sequence>
</s:complexType>
</s:element>
我会调查System.Xml.Linq.XElement
。至少据我所知,它不会为您执行(反)序列化,但它会解析XML并为您提供一个非常好的接口,以便您自己进行反序列化。更不用说,它是。net框架的一部分,这也是一个不错的小奖励。
var element = System.Xml.Linq.XElement.Parse("[your xml"]);
然后您可以使用XElement.Element
和Elements
方法来导航。只要密切关注名称空间,因为如果您不注意的话,它们可能会有点棘手。但是一旦你掌握了它的窍门,它就非常适合。
或者等一下,如果你正在寻找为你生成c#代码的东西,这是非常不同的。
编辑2:
您刚刚明确表示,您实际上希望序列化数据,而不是反序列化它。我的观点仍然成立。XElement类是一种很好的方式,可以根据对象构建动态的、自定义的XML,以满足您的规范。您可能会找到一些库来帮您完成这些工作,但我倾向于更实际的方法。特别是对于像与web服务对话这样复杂的事情,如果你将你的模型直接绑定到他们的请求格式,你们中的任何一个人的更改都可能导致巨大的问题。
编辑3:* *
我想这也值得提出DataContractSerializer
,尽管由于我之前说过的原因,我倾向于反对它作为一般规则。很容易,但老实说,在大多数情况下,我不确定这比手工构建XML容易多少,特别是考虑到调试手工的东西是多么容易,而调试几乎完全依赖属性的东西是多么困难。
如果您删除名称空间(s:)并且您正在使用VS2013,则可以复制xml,并使用Edit->Paste Special->Paste xml作为类。我就这么做了,得到了以下内容:
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class element
{
private elementComplexType complexTypeField;
private string nameField;
/// <remarks/>
public elementComplexType complexType
{
get
{
return this.complexTypeField;
}
set
{
this.complexTypeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class elementComplexType
{
private elementComplexTypeElement[] sequenceField;
/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("element", IsNullable = false)]
public elementComplexTypeElement[] sequence
{
get
{
return this.sequenceField;
}
set
{
this.sequenceField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class elementComplexTypeElement
{
private byte minOccursField;
private string maxOccursField;
private string nameField;
private string typeField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public byte minOccurs
{
get
{
return this.minOccursField;
}
set
{
this.minOccursField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string maxOccurs
{
get
{
return this.maxOccursField;
}
set
{
this.maxOccursField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string type
{
get
{
return this.typeField;
}
set
{
this.typeField = value;
}
}
}