将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>

将xml web服务数据对象转换为c#

我会调查System.Xml.Linq.XElement。至少据我所知,它不会为您执行(反)序列化,但它会解析XML并为您提供一个非常好的接口,以便您自己进行反序列化。更不用说,它是。net框架的一部分,这也是一个不错的小奖励。

var element = System.Xml.Linq.XElement.Parse("[your xml"]);

然后您可以使用XElement.ElementElements方法来导航。只要密切关注名称空间,因为如果您不注意的话,它们可能会有点棘手。但是一旦你掌握了它的窍门,它就非常适合。

编辑:

或者等一下,如果你正在寻找为你生成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;
        }
    }
}