C#如何填充从数据库使用XSD.EXE创建的类

时间:2010-09-08 02:56:43

标签: c# .net xsd xml-serialization

通常我会编写一个类并为其Web服务添加XML序列化。

[XmlRootAttribute(ElementName = "dsXmlSummary", IsNullable=true)]
public class Class1
{
    //declare properties
    //make database calls to pull data and load properties
}

我正在开发一个项目,要求我使用严格的XSD,我已经按照使用XSD.EXE工具创建基于XSD的类的说明。我的解释是这个自动生成的类将取代我的正常序列化类。

如果是这种情况,我在将数据加载到类属性时完全丢失了。 我从另一个走过来收集了这个:

[WebMethod]
public dsXmlSummary getXML()
{
    TextReader reader = new StreamReader("data.xml");
    dsXmlSummary ds = (dsXmlSummary)serializer.Deserialize(reader);
    reader.Close();
}

然而,我拥有的数据位于SQL数据库中...我想我应该能够编写一个方法来填充dsXmlSummary类,但是我找不到任何关于这样做的文档。所有示例都与上述类似,从实际的物理xml文档加载或读取。

我尝试测试手动加载:

    [WebMethod]
    public dsXmlSummary getXML()
    {
        dsXmlSummary xml = new dsXmlSummary();
        xml.Items[0].nameFirst = "Mark"; //error thrown here: System.NullReferenceException: Object reference not set to an instance of an object.
        xml.Items[0].nameLast = "Twain";
        xml.Items[0].Type = "Writer";

        return xml;
    }

显然,我认为这一切都是错的。非常感谢任何指导。

修改

我的WebMethod

        [WebMethod]
    public dsXmlSummary getXML()
    {
        dsXmlSummary xml = new dsXmlSummary();
        dsXmlSummaryAdmin_reports_xmlReports[] items = new dsXmlSummaryAdmin_reports_xmlReports[1];
        items[0].nameFirst = "Mark"; //error still thrown here: System.NullReferenceException: Object reference not set to an instance of an object.
        items[0].nameLast = "Twain";
        items[0].Type = "Writer";

        xml.Items = items;
        return xml;
    }

自动生成的课程

public partial class dsXmlSummary {

private dsXmlSummaryAdmin_reports_xmlReports[] itemsField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("admin_reports_xmlReports")]
public dsXmlSummaryAdmin_reports_xmlReports[] Items {
    get {
        return this.itemsField;
    }
    set {
        this.itemsField = value;
    }
  }
}

2 个答案:

答案 0 :(得分:4)

如果您从数据库中获取XML作为字符串,则可以使用StringReader。或者,如果您获得byte[],则可以尝试MemoryStream

[WebMethod]
public dsXmlSummary getXML()
{
    TextReader reader = new StringReader("<dsXmlSummary><FirstName>Mark</FirstName></dsXmlSummary>");
    dsXmlSummary ds = (dsXmlSummary)serializer.Deserialize(reader);
    reader.Close();
}

关于“手动”示例,您需要初始化Items数组 的&LT;编辑&gt;添加了xml.Items[0] = new YourItemsType();&lt; / edit&gt;

[WebMethod]
public dsXmlSummary getXML()
{
    dsXmlSummary xml = new dsXmlSummary();
    xml.Items = new YourItemsType[1];    // <-- initialize here
    xml.Items[0] = new YourItemsType();  // <-- initialize first object
    xml.Items[0].nameFirst = "Mark"; //error thrown here: System.NullReferenceException: Object reference not set to an instance of an object.
    xml.Items[0].nameLast = "Twain";
    xml.Items[0].Type = "Writer";

    return xml;
}

答案 1 :(得分:0)

据我记忆,您可以获取数据集/数据表XML(ToString()?或者可能是WriteXML)_,不确定)..然后使用