Xml-Deserialization,我做错了什么?

时间:2014-09-03 14:20:09

标签: c# xml class deserialization xml-deserialization

我要做的是将Xml转换为c#类。

这是我的xml:

<?xml version="1.0"?>
<ReportCollection>
<reports>
    <rpt name="Auftrag.mrt">
        <ConnectionString>
            some stuff
        </ConnectionString>
        <Fields>
            <Field name="EON" inDb="dbo.PEARepVServiceAnforderung.EON" />
            <Field name="Mandant" inDb="dbo.PEARepVServiceAnforderung.Mandant" />
            <Field name="Anrede" inDb="KHKAdressen2.Anrede" />
            <Field name="Name1" inDb="KHKAdressen2.Name1" />
            <Field name="Name2" inDb="KHKAdressen2.Name2" />
            <Field name="LieferStrasse" inDb="KHKAdressen2.LieferStrasse" />
            <Field name="LieferPLZORT" inDb="KHKAdressen2.LieferPLZ + ' ' + KHKAdressen2.LieferOrt AS LieferPLZORT" />
            <Field name="Telefon" inDb="KHKAdressen2.Telefon" />
            <Field name="DebitorName1" inDb="KHKAdressen_1.Name1 AS DebitorName1" />
            <Field name="DebitorName2" inDb="KHKAdressen_1.Name2 AS DebitorName2" />
            <Field name="DebitorStrasse" inDb="KHKAdressen_1.LieferStrasse AS DebitorStrasse" />
            <Field name="DebitorPLZOrt" inDb="KHKAdressen_1.LieferLand + ' - ' + KHKAdressen_1.LieferPLZ + ' ' + KHKAdressen_1.LieferOrt AS DebitorPLZOrt" />
            <Field name="EdkdauftragNr" inDb="dbo.PEARepVServiceAnforderung.EdkdauftragNr" />
            <Field name="Auftragsdatum" inDb="CONVERT(nvarchar(10), dbo.PEARepVServiceAnforderung.EingangZeitpkt, 104) AS Auftragsdatum" />
            <Field name="Bearbeiter" inDb="dbo.PEARepVServiceAnforderung.Bearbeiter" />
            <Field name="StandortMatchcode" inDb="KHKAdressen2.Matchcode AS StandortMatchcode" />
            <Field name="Kommentar" inDb="dbo.PEARepVServiceAnforderung.Kommentar" />
            <Field name="Callnummer" inDb="dbo.PEARepVServiceAnforderung.KdauftragsNr AS Callnummer" />
            <Field name="Ansprechpartner" inDb="dbo.PEARepVServiceAnforderung.Ansprechpartner" />
            <Field name="Mobil" inDb="KHKAdressen2.Mobilfunk AS Mobil" />
            <Field name="AuftraggeberAdresse" inDb="KHKAdressen_1.Adresse AS AuftraggeberAdresse" />
            <Field name="Auftraggeber" inDb="dbo.PEARepVServiceAnforderung.Rechnungsempfaenger AS Auftraggeber" />
            <Field name="DebitorTelefon" inDb="KHKAdressen_1.Telefon AS DebitorTelefon" />
            <Field name="DebitorFax" inDb="KHKAdressen_1.Telefax AS DebitorFax" />
            <Field name="DebitorEMail" inDb="KHKAdressen_1.EMail AS DebitorEMail" />
            <Field name="DebitorHomepage" inDb="KHKAdressen_1.Homepage AS DebitorHomepage" />
            <Field name="TerminVon" inDb="(CASE WHEN CONVERT(nvarchar(10), PEARepVServiceAnforderung.TerminVon, 104) &lt;&gt; CONVERT(nvarchar(10), PEARepVServiceAnforderung.EingangZeitpkt, 104) THEN CONVERT(nvarchar(10), PEARepVServiceAnforderung.TerminVon, 104) + ' ' + CONVERT(nvarchar(5), PEARepVServiceAnforderung.TerminVon, 108) ELSE ' ' END) AS TerminVon" />
            <Field name="TerminBis" inDb="(CASE WHEN CONVERT(nvarchar(10), PEARepVServiceAnforderung.TerminBis, 104) &lt;&gt; CONVERT(nvarchar(10), PEARepVServiceAnforderung.EingangZeitpkt, 104) THEN CONVERT(nvarchar(10), PEARepVServiceAnforderung.TerminBis, 104) + ' ' + CONVERT(nvarchar(5), PEARepVServiceAnforderung.TerminBis, 108) ELSE ' ' END) AS TerminBis" />
            <Field name="DebitorAnrede" inDb="KHKAdressen_1.Anrede AS DebitorAnrede" />
            <Field name="Telefax" inDb="KHKAdressen2.Telefax" />
            <Field name="EMail" inDb="KHKAdressen2.EMail" />
            <Field name="Homepage" inDb="KHKAdressen2.Homepage" />
        </Fields>
    </rpt>
    <rpt name="sub_Info_an_Kunde.mrt">
        <ConnectionString>
            some stuff
        </ConnectionString>
        <Fields>
            <Field name="EON" inDb="PEARepVServiceAnforderung.EON" />
            <Field name="Mandant" inDb="PEARepVServiceAnforderung.Mandant" />
            <Field name="Anrede" inDb="KHKAdressen2.Anrede" />
            <Field name="Name1" inDb="KHKAdressen2.Name1" />
            <Field name="Name2" inDb="KHKAdressen2.Name2" />
            <Field name="LieferStrasse" inDb="KHKAdressen2.LieferStrasse" />
            <Field name="LieferPLZORT" inDb="KHKAdressen2.LieferPLZ + ' ' + KHKAdressen2.LieferOrt AS LieferPLZORT" />
            <Field name="Telefon" inDb="KHKAdressen2.Telefon" />
            <Field name="DebitorName1" inDb="KHKAdressen.Name1 AS DebitorName1" />
            <Field name="DebitorName2" inDb="KHKAdressen.Name2 AS DebitorName2" />
            <Field name="DebitorStrasse" inDb="KHKAdressen.LieferStrasse AS DebitorStrasse" />
            <Field name="DebitorPLZOrt" inDb="KHKAdressen.LieferLand + ' - ' + KHKAdressen.LieferPLZ + ' ' + KHKAdressen.LieferOrt AS DebitorPLZOrt" />
            <Field name="Callnummer" inDb="PEARepVServiceAnforderung.EdkdauftragNr AS Callnummer" />
            <Field name="Auftragsdatum" inDb="CONVERT(nvarchar(10)" />
            <Field name="Bearbeiter" inDb="PEARepVServiceAnforderung.Bearbeiter" />
            <Field name="Auftraggeber" inDb="PEARepVServiceAnforderung.Rechnungsempfaenger AS Auftraggeber" />
            <Field name="StandortMatchcode" inDb="KHKAdressen2.Matchcode AS StandortMatchcode" />
            <Field name="TerminVon" inDb="PEARepVServiceAnforderung.TerminVon" />
            <Field name="TerminBis" inDb="PEARepVServiceAnforderung.TerminBis" />
            <Field name="TechnikerName" inDb="KHKAdressen1.Name1 AS TechnikerName" />
            <Field name="WerkstattNr" inDb="KHKAdressen1.Referenz AS WerkstattNr" />
            <Field name="Kommentar" inDb="PEARepVServiceAnforderung.Kommentar" />
            <Field name="EndKdNr" inDb="PEARepVStandortErweiterung.EndKdNr" />
            <Field name="KdauftragsNr" inDb="PEARepVServiceAnforderung.KdauftragsNr" />
            <Field name="Ansprechpartner" inDb="PEARepVServiceAnforderung.Ansprechpartner" />
        </Fields>
    </rpt>
    <rpt name="sub_Gesamtpreis.mrt">
        <ConnectionString>
            some stuff
        </ConnectionString>
        <Fields>
            <Field name="EON" inDb="EON" />
            <Field name="Mandant" inDb="Mandant" />
            <Field name="Summe" inDb="Summe" />
        </Fields>
    </rpt>
    <rpt name="sub_ReparaturauftragGeräte.mrt">
        <ConnectionString>
            some stuff
        </ConnectionString>
        <Fields>
            <Field name="EON" inDb="dbo.PEARepVServiceAnforderungGeraete.EON" />
            <Field name="Mandant" inDb="dbo.PEARepVServiceAnforderungGeraete.Mandant" />
            <Field name="ServiceAnforderungGeraetePosition" inDb="dbo.PEARepVServiceAnforderungGeraete.ServiceAnforderungGeraetePosition" />
            <Field name="ArtikelGruppenGeräteart" inDb="dbo.KHKArtikelgruppen.Bezeichnung AS ArtikelGruppenGeräteart" />
            <Field name="Hersteller" inDb="dbo.KHKArtikel.Hersteller" />
            <Field name="Typ" inDb="dbo.PEARepVGeraete.ArtikelNummer AS Typ" />
            <Field name="SerienNr" inDb="dbo.PEARepVGeraete.SerienNr" />
            <Field name="Geräteart" inDb="dbo.KHKArtikel.Matchcode as Geräteart" />
            <Field name="User_HerstellerSN" inDb="dbo.PEARepVGeraete.User_HerstellerSN" />
        </Fields>
    </rpt>
    <rpt name="sub_ReparaturauftragKDInfo.mrt">
        <ConnectionString>
            some stuff
        </ConnectionString>
        <Fields>
            <Field name="EON" inDb="EON" />
            <Field name="Mandant" inDb="Mandant" />
            <Field name="Kommentar" inDb="Kommentar" />
        </Fields>
    </rpt>
    <rpt name="sub_ServiceAdresse.mrt">
        <ConnectionString>
            some stuff
        </ConnectionString>
        <Fields>
            <Field name="Adresse" inDb="Adresse" />
            <Field name="Mandant" inDb="Mandant" />
            <Field name="USER_ServiceTelefon" inDb="USER_ServiceTelefon" />
            <Field name="USER_ServiceFax" inDb="USER_ServiceFax" />
            <Field name="USER_ServiceMail" inDb="USER_ServiceMail" />
        </Fields>
    </rpt>
    <rpt name="sub_ServiceAnforderungenArtikel.mrt">
        <ConnectionString>
            some stuff
        </ConnectionString>
        <Fields>
            <Field name="EON" inDb="EON" />
            <Field name="Mandant" inDb="Mandant" />
            <Field name="Pos" inDb="ServiceAnforderungDetailsPosition AS Pos" />
            <Field name="ETNummer" inDb="ArtikelNummer AS ETNummer" />
            <Field name="Bezeichnung" inDb="Bezeichnung1 AS Bezeichnung" />
            <Field name="Stück" inDb="Menge AS Stück" />
            <Field name="EPreis" inDb="Einzelpreis AS EPreis" />
            <Field name="GPreis" inDb="Summe AS GPreis" />
        </Fields>
    </rpt>
    <rpt name="sub_ServiceAnforderungGeräte.mrt">
        <ConnectionString>
            some stuff
        </ConnectionString>
        <Fields>
            <Field name="EON" inDb="PEARepVServiceAnforderungGeraete.EON" />
            <Field name="Mandant" inDb="PEARepVServiceAnforderungGeraete.Mandant" />
            <Field name="ServiceAnforderungGeraetePosition" inDb="PEARepVServiceAnforderungGeraete.ServiceAnforderungGeraetePosition" />
            <Field name="Fehler" inDb="PEARepVServiceAnforderung.Kommentar AS Fehler" />
            <Field name="Auftrag" inDb="PEARepVServiceAnforderungGeraete.Fehlerbeschreibung AS Auftrag" />
            <Field name="Reparaturbeschreibung" inDb="PEARepVServiceAnforderungGeraete.Fehlerbehebung AS Reparaturbeschreibung" />
            <Field name="FehlerCode" inDb="PEARepVServiceAnforderungGeraete.FehlerCode" />
            <Field name="FehlerCodeERWID" inDb="PEARepVServiceAnforderungGeraete.FehlerCodeERWID" />
            <Field name="Fehlertyp" inDb="(Select Bezeichnung from PEARepVGruppen where Gruppe = PEARepVServiceAnforderungGeraete.FehlerCodeERWID and Typ = 60) as Fehlertyp" />
            <Field name="FehlerCodeID" inDb="PEARepVServiceAnforderungGeraete.FehlerCodeID" />
        </Fields>
    </rpt>
    <rpt name="sub_Termin.mrt">
        <ConnectionString>
            some stuff
        </ConnectionString>
        <Fields>
            <Field name="EON" inDb="EON" />
            <Field name="Mandant" inDb="Mandant" />
            <Field name="TerminVon" inDb="(CASE WHEN CONVERT(nvarchar(10)" />
            <Field name="TerminBis" inDb="(CASE WHEN CONVERT(nvarchar(10), TerminBis, 104) &lt;&gt; CONVERT(nvarchar(10), EingangZeitpkt, 104) THEN CONVERT(nvarchar(10), TerminBis, 104) + ' ' + CONVERT(nvarchar(5), TerminBis, 108) ELSE ' ' END) AS TerminBis" />
        </Fields>
    </rpt>
</reports>
</ReportCollection>

这些是我的课程:

Reports.cs:

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

namespace eRepairXmlLogic
{
    [Serializable()]
    [System.Xml.Serialization.XmlRoot("ReportCollection")]
    public class ReportCollection
    {
        [XmlArray("Reports")]
        [XmlArrayItem("rpt", typeof(Report))]
        public Report[] Report { get; set; }
    }
}

Report.cs:

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

namespace eRepairXmlLogic
{
    [Serializable()]
    [System.Xml.Serialization.XmlRoot("Report")]
    public class Report
    {
        [System.Xml.Serialization.XmlElement("name")]
        public string name { get; set; }

        [System.Xml.Serialization.XmlElement("ConnectionString")]
        public string conStr { get; set; }

        [XmlArray("Fields")]
        [XmlArrayItem("Field", typeof(Field))]
        public Field[] Field { get; set; }
    }
}

Field.cs:

using System;
using System.Collections.Generic;
using System.Text;

namespace eRepairXmlLogic
{
    [Serializable()]
    public class Field
    {
        [System.Xml.Serialization.XmlElement("name")]
        public string name { get; set; }

        [System.Xml.Serialization.XmlElement("inDb")]
        public string inDb { get; set; }
    }
}

这是我的代码:

static bool DeserializeXml(string path)
{
    ReportCollection rpts = null;

    XmlSerializer serializer = new XmlSerializer(typeof(ReportCollection));

    StreamReader reader = new StreamReader(path);
    rpts = (ReportCollection)serializer.Deserialize(reader);
    reader.Close();

    return true;
}

因为我从这篇文章How to Deserialize XML document得到了这个应该有效,我放弃了,我得到一个错误:

rpts = (ReportCollection)serializer.Deserialize(reader);

类型错误:System.Xml.dll中的“System.InvalidOperationException”

其他信息:XML-Document(2,2)中的错误

1 个答案:

答案 0 :(得分:1)

在班级Report中,删除属性XmlRoot

    [Serializable()]
    //[System.Xml.Serialization.XmlRoot("Report")] //Remove or comment this
    public class Report
    {
        .
        .
        .