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

时间:2014-07-14 09:30:10

标签: c# web-services

我在为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>

2 个答案:

答案 0 :(得分:0)

我会调查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更容易,特别是考虑到调试手动内容有多容易以及调试内容有多难这几乎完全取决于属性。

答案 1 :(得分:0)

如果删除命名空间(s :)并且您正在使用VS2013,则可以复制xml,并使用Edit-&gt; Paste Special-&gt; Paste XML as classes。我刚刚做到了,并得到了以下内容:

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