2016-07-01 16 views
0

Ich versuche, ein bestimmtes XML zu lesen, speichern Sie die erforderlichen Informationen in zwei verschiedenen Klassen Order und OrderDetail. Aber wenn ich versuche, "BuyerID" von meiner XML mit dem folgenden Code zu lesen, es wirft mir ein InvalidOperationException mit ReadElementContentAsString method is not supported on node type None. Line 1, Position 634: http://pastebin.com/Lu4mKtwqC# XmlReader ReadElementContentAsString() InvalidOperationException

An dieser bestimmten Zeile:

order.CustomerID = reader.ReadElementContentAsString(); 

Mein Quellcode: http://pastebin.com/JyTz8x0G

Dies ist der XML-Code, mit denen ich arbeite:

Order xml that contains information for order and order detail class XML in Text:

<Orders> 
<Order ID="O2"> 
<OrderDate>1/7/2016</OrderDate> 
<BuyerID>WSC1810</BuyerID> 
<OrderItem> 
<Item ID="R1"> 
<ItemName>8GB RAM King</ItemName> 
<Decscription>8GB RAM King</Decscription> 
<Capacity>8GB</Capacity> 
<Quantities>150</Quantities> 
<existingUnitPrice>100.00</existingUnitPrice> 
</Item> 
<Item ID="R2"> 
<ItemName>4GB RAM King</ItemName> 
<Decscription>4GB RAM King Brand</Decscription> 
<Capacity>4GB</Capacity> 
<Quantities>100</Quantities> 
<existingUnitPrice>50.00</existingUnitPrice> 
</Item> 
</OrderItem> 
<RemarksandSpecialInstruction>Fragile, handle with care</RemarksandSpecialInstruction> 
</Order> 
</Orders> 

Die Klassen, die ich arbeite mit: Order and Order detail classes

+0

Können Sie die XML-Eingabe auch als Text anstatt als Bild posten? – cvraman

+0

Auch aus Neugierde, wenn Sie XML in Objekt konvertieren möchten und umgekehrt, warum nicht einfach Serialisierung und Deserialisierung statt jede Eigenschaft lesen? – cvraman

+0

Projektspezifikationen: v – Kei

Antwort

1

Die ReadElementContentAsString Verfahren nach dem Lesen der aktuellen Knoten bewegt sich zur nächsten verbessern. Also in Ihrem Fall nach dem Code unten mit

reader.ReadToFollowing("OrderDate"); 
order.OrderDate = reader.ReadElementContentAsString(); 

Jetzt ist der Code bereits bei OrderID ist, so versuchen Sie nicht, es noch einmal zu lesen. Stattdessen unten etwas wie der Code tun:

 while (reader.ReadToFollowing("Order")) 
     {    
      order.OrderID = reader.GetAttribute("ID"); 
      string orderID = reader.Value; 

      reader.ReadToFollowing("OrderDate"); 
      if(reader.Name.Equals("OrderDate")) 
       order.OrderDate = reader.ReadElementContentAsString(); 
      if (reader.Name.Equals("BuyerID")) 
       order.CustomerID = reader.ReadElementContentAsString();    
      orderList.Add(order); 
      while (reader.ReadToFollowing("Item")) 
      { 
       OrderDetail i = new OrderDetail(); 
       i.OrderID = orderID;     
       i.ItemID = reader.GetAttribute("ID"); 

       reader.ReadToFollowing("Decscription"); 
       if (reader.Name.Equals("Decscription")) 
        i.Description = reader.ReadElementContentAsString(); 
       if (reader.Name.Equals("Capacity")) 
        i.Capacity = reader.ReadElementContentAsString(); 
       if (reader.Name.Equals("Quantities")) 
        i.Quantity = reader.ReadElementContentAsInt(); 
       if (reader.Name.Equals("existingUnitPrice")) 
        i.AskingPrice = reader.ReadElementContentAsDecimal(); 
       orderDetailList.Add(i); 
      } 
     } 

Auch stellen Sie sicher, dass Ihre xml und Ihr Modell sind ein Spiel.

0

Die Kundennummer korrekt tatsächlich gelesen wird, dann ist es die Zeile unter dem, was eine Ausnahme erzieht. Ihre Fehler auf dieser Codezeile:

reader.ReadToFollowing("Instructions"); 

Der Grund dafür ist, dass der XML nicht das Element enthält Instructions. Sie könnten Ihren Code durch nicht verwirft das Ergebnis der ReadToFollowing

if (reader.ReadToFollowing("Instructions")) 
    reader.ReadElementContentAsString(); 
+0

Ich änderte es zum korrekten Elementnamen, aber es zeigt noch auf den gleichen Platz – Kei

Verwandte Themen