2017-07-26 2 views
0

Ich erhalte eine FormatException-Fehler "Eingabe Zeichenfolge war nicht in einem korrekten Format." Fehler ...C# befüllen Klassenarray von XML Linq führt zu FormatException

Employee-Klasse sind alle Strings außer dem Status (int), Typ (int) und angezeigt (Bool)

public partial class Version2 : System.Web.UI.Page { 

     private Employee[] Employees; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       XDocument xdoc = XDocument.Load(Server.MapPath("~/")+ "V2Employees.xml"); 
       IEnumerable<XElement> emps = xdoc.Root.Descendants(); 

       Employees = emps.Select(x => new Employee() 
       { 
        Employee_ID = x.Attribute("id").Value, 
        First_Name = x.Element("First_Name").Value, 
        Last_Name = x.Element("Last_Name").Value, 
        Classification_Group = x.Element("Classification_Group").Value, 
        Classification_Level = x.Element("Classification_Level").Value, 
        Postion_Number = x.Element("Postion_Number").Value, 
        English_Title = x.Element("English_Title").Value, 
        French_Title = x.Element("French_Title").Value, 
        Location = x.Element("Location").Value, 
        Language = x.Element("Language").Value, 
        Department_ID = x.Element("Department_ID").Value, 
        Status = int.Parse(x.Element("Status").ToString()), 
        Type = int.Parse(x.Element("Type").ToString()), 
        Displayed = false}).ToArray(); 
     } 

Beispiel XML in gehen:

<?xml version="1.0" encoding="utf-8" ?> 
    <employees> 
     <employee id="1"> 
     <First_Name>Jane</First_Name> 
     <Last_Name>Doe</Last_Name> 
     <Classification_Group>AA</Classification_Group> 
     <Classification_Level>02</Classification_Level> 
     <Postion_Number>12345</Postion_Number> 
     <English_Title>Bob</English_Title> 
     <French_Title></French_Title> 
     <Location>Null Island</Location> 
     <Language>English</Language> 
     <Department_ID>000001</Department_ID> 
     <Status>1</Status> 
     <Type>4</Type> 
     </employee> 
</employees> 
+0

könnte versuchen, alle Linien zu kommentieren heraus dann zu einem Zeitpunkt in einem Kommentar, das zu finden, die den Fehler verursacht haben – RoguePlanetoid

+2

Sie haben 'x.Element („Status“). ToString()' sollte nicht 'x.Element (" Status ") sein. Value.ToString()', ähnlich wie in der Zeile darunter. – Valeklosse

+0

Oder nur 'x.Element (" Status "). Wert 'vorausgesetzt, dass der Typ von' XElement.Value' 'string' ist, oder einfach eine Umwandlung verwenden:' (string) x.Element ("Status") 'to Holen Sie sich den String-Wert, oder noch besser, verwenden Sie einfach die Umwandlung von 'XElement' nach' int': '(int)' x.Element ("Status") '. –

Antwort

1

Siehe Code unten berichten konnten. Das Update war: xdoc.Root.Descendants ("Mitarbeiter"); Ich habe auch andere Verbesserungen

public class Employee 
    { 
     static Employee[] Employees = null; 

     const string FILENAME = @"c:\temp\test.xml"; 
     public static Boolean IsPostBack = false; 

     string Employee_ID { get; set; } 
     string First_Name { get; set; } 
     string Last_Name { get; set; } 
     string Classification_Group { get; set; } 
     string Classification_Level { get; set; } 
     string Postion_Number { get; set; } 
     string English_Title { get; set; } 
     string French_Title { get; set; } 
     string Location { get; set; } 
     string Language { get; set; } 
     string Department_ID { get; set; } 
     int Status { get; set; } 
     int Type { get; set; } 
     Boolean Displayed { get; set; } 


     //protected void Page_Load(object sender, EventArgs e) 
     public void Page_Load() 
     { 
      if (!IsPostBack) 
      { 
       XDocument xdoc = XDocument.Load(FILENAME); 
       IEnumerable<XElement> emps = xdoc.Root.Descendants("employee"); 

       Employees = emps.Select(x => new Employee() 
       { 
        Employee_ID = (string)x.Attribute("id"), 
        First_Name = (string)x.Element("First_Name"), 
        Last_Name = (string)x.Element("Last_Name"), 
        Classification_Group = (string)x.Element("Classification_Group"), 
        Classification_Level = (string)x.Element("Classification_Level"), 
        Postion_Number = (string)x.Element("Postion_Number"), 
        English_Title = (string)x.Element("English_Title"), 
        French_Title = (string)x.Element("French_Title"), 
        Location = (string)x.Element("Location"), 
        Language = (string)x.Element("Language"), 
        Department_ID = (string)x.Element("Department_ID"), 
        Status = (int)x.Element("Status"), 
        Type = (int)x.Element("Type"), 
        Displayed = false 
       }).ToArray(); 
      } 
     } 
    } 
2

Durch den Aufruf ToString auf einem XElement, enden Sie mit dem gesamten Element als String, z

<Status>4</Status> 

... und zu versuchen, dass als int zu analysieren. Ich würde dringend empfehlen:

  • Gerade mit der Value Eigenschaft oder eine Besetzung zu string, wenn Sie den Wert eines Elements als String (keine Notwendigkeit für einen ToString Anruf danach)
  • Mit einem Guss zu int wollen, wenn Sie möchten ein XElement ‚s Wert auf eine ganze Zahl

ich würde schreiben Sie Ihre Select wie konvertieren:

// Property names adjusted to .NET naming conventions, type of 
// PositionNumber changed to an int. 
Employees = emps.Select(x => new Employee 
{ 
    EmployeeId = (string) x.Attribute("id"), 
    FirstName = (string) x.Element("First_Name"), 
    LastName = (string) x.Element("Last_Name"), 
    ClassificationGroup = (string) x.Element("Classification_Group"), 
    ClassificationLevel = (string) x.Element("Classification_Level"), 
    PositionNumber = (int) x.Element("Postion_Number"), 
    EnglishTitle = (string) x.Element("English_Title"), 
    FrenchTitle = (string) x.Element("French_Title"), 
    Location = (string) x.Element("Location"), 
    Language = (string) x.Element("Language"), 
    DepartmentId = (string) x.Element("Department_ID"), 
    Status = (int) x.Element("Status"), 
    Type = (int) x.Element("Type"), 
    Displayed = false 
} 

Sie möglicherweise möchten .Value statt der Besetzung zu string verwenden, was bedeutet, dass Sie eine NullReferenceException erhalten, wenn das Element das entsprechende Unterelement fehlt. Sie wollen stattdessen die obige Formular verwenden, haben dann eine Validate Methode zu überprüfen, dass es alle erforderlichen Informationen hat -, dass Sie Fehler wahrscheinlich erlauben würde, deutlicher zu berichten:

  • Man könnte sagen, welche Eigenschaft fehlt eher als nur eine Ausnahme bekommen
  • Sie mehr fehlenden Eigenschaften in einer einzigen Fehlermeldung