C # Как заполнить класс, созданный с помощью XSD.EXE из базы данных - PullRequest
1 голос
/ 08 сентября 2010

Обычно я пишу класс и добавляю в него сериализацию 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 ]

4 голосов
/ 08 сентября 2010

Если вы получаете свой 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.
Добавлено xml.Items[0] = new YourItemsType();

[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;
}
0 голосов
/ 08 сентября 2010

Насколько я помню, вы можете получить Dataset / Datatable XML (ToString ()? Или может быть WriteXML) _, не уверен) .. затем использовать это

...