2016-06-27 14 views
0

Ich habe gerade mit dem Erlernen von SAX/Stream- und DOM-Ansätzen zum Parsen und Verarbeiten von XML-Dateien begonnen. Mein Szenario wäre, dass ich Informationen von einer gegebenen XML-Datei, die von einem FTP-Server gehosted wurde, in separate Array-Listen verarbeite, bevor ich die Listen in meinen DBManager übertrage, um sie in eine Datenbank einzufügen. Aber bevor ich es in die Datenbank aufnehmen möchte, möchte ich, dass der Benutzer die "Check-Schaltfläche" drückt, um sicherzustellen, dass die Informationen tatsächlich korrekt sind, bevor "zur Datenbank hinzugefügt" wird. Aber das löst irgendwie eine FormatException aus. Ich sehe keine "DateTime" in irgendeiner meiner Klassen oder Variablen, was mich noch weiter verwirrt.C# FormatException wurde bei der Verarbeitung von XML über DOM-Ansatz nicht behandelt

EDIT 1: Dank Abdo Hussein, wurde mir klar, das Problem im Screenshot angegeben war, dass ich Knoten, nicht Knoten2 wurde mit. Das gleiche Problem gilt jedoch für die folgende Zeile und möglicherweise auch für die folgende Zeile. Obwohl sie immer noch innerhalb der gleichen Schleife sind wie Knoten und nicht node2.

invoice.ShippingCharges = Convert.ToDecimal(node.ChildNodes[4].InnerText); 
invoice.InvoiceTotal = Convert.ToDecimal(node.ChildNodes[5].InnerText); 

enter image description here

FormatException was unhandled

Dies ist der Pastebin-Code für diese besondere Klasse, da es zu lang und chaotisch (ich weiß, ich es für später verlassen werde, muss ich zu überholen diese erste) http://pastebin.com/FewCm23W

Im Folgenden wird die XML, die ich arbeite:

<?xml version="1.0" encoding="utf-8" ?> 
<Invoices> 
    <Invoice ID="I001">  
    <InvoiceDate>21/06/2016</InvoiceDate> 
    <SellerID>Supp001</SellerID> 
    <BuyerID>WCS1810</BuyerID> 
    <OrderID>Order001</OrderID> 
    <InvoiceItem> 
     <Product ID="R001"> 
     <ProductName>8GB RAM King</ProductName> 
     <Description>RAM</Description> 
     <Capacity>8GB</Capacity> 
     <Quantity>2</Quantity> 
     <UnitPrice>100</UnitPrice> 
     </Product> 
    </InvoiceItem> 
    <ShippingCharges>5</ShippingCharges> 
    <InvoiceTotal>205</InvoiceTotal> 
    </Invoice> 
</Invoices> 

Dies sind die Klassen für die verschiedenen Arten von Informationen gespeichert werden:

Invoice.cs

class Invoice 
{ 
    public string InvoiceID { get; set; } 
    public string InvoiceDate { get; set; } 
    public string OrderID { get; set; } 
    public string SellerID { get; set; } 
    public decimal ItemsTotalPrice { get; set; } 
    public decimal ShippingCharges { get; set; } 
    //shippin charges + itemsTotalPrice 
    public decimal InvoiceTotal { get; set; } 
} 

InvoiceItem

class InvoiceItem 
{ 
    public string InvoiceID { get; set; } 
    public string ProductID { get; set; } 
    public string Description { get; set; } 
    public string Capacity { get; set; } 
    public int Quantity { get; set; } 
    public decimal UnitPrice { get; set; } 
    public decimal TotalPrice { get; set; } 
} 

Antwort

1

Datetime ist nur ein Tipp zur Fehlerbehebung, bedeutet nicht, Sie haben eine DateTime-Format-Ausnahme.

Sie verwenden Knoten Variable in Ihrem foreach nicht die Knoten2, check this out.

Beachten Sie, dass: -

1- Format: Wert keine Zahl in einem gültigen Format ist.

https://msdn.microsoft.com/en-us/library/9k6z9cdw(v=vs.110).aspx

2- Prüfen Sie die Culture als Formate hängt von verschiedenen "Culture" unterscheiden s

+0

Sorgfältig angeben, welche foreach? – Kei

+0

Weil ich in der Lage sein soll, den in node2 genommenen Wert zu berechnen und ihn im Knoten – Kei

+0

Aaah zu speichern, nachdem ich eine Pause gemacht habe und an etwas anderem gearbeitet habe und zurück gekommen bin, habe ich gesehen, wo der node2 dumme Fehler ist. Aber das Problem ist, dass für diese Zeilen: invoice.ShippingCharges = Convert.ToDecimal (node.ChildNodes [4] .InnerText); invoiceTotal = Convert.ToDecimal (node.ChildNodes [5] .InnerText); das Problem besteht fort – Kei

1

Aah, ich verstehe jetzt.

Problem 1 - Knoten intead von Node2 für jede der Dezimalvariablen, die ich konvertiere.

foreach (XmlNode node2 in productList) 
{ 
    decimal qty = Convert.ToDecimal(node.ChildNodes[3].InnerText); 
    decimal unitpx = Convert.ToDecimal(node.ChildNodes[4].InnerText); 
    totalItemPrice += (qty * unitpx); 

} 

Problem 2- Ich wusste nicht, dass die gesamte InvoiceItem ein childNode betrachtet wurde.So tauschen meine und [5] bis [5] und [6] funktioniert.

invoice.ShippingCharges = Convert.ToDecimal(node.ChildNodes[5].InnerText); 
invoice.InvoiceTotal = Convert.ToDecimal(node.ChildNodes[6].InnerText);