C# XmlReader ReadElementContentAsString() InvalidOperationException 异常

C# XmlReader ReadElementContentAsString() InvalidOperationException

我正在尝试读取特定的 XML,将必要的信息保存到两个不同的 类 OrderOrderDetail 中。但是,当我尝试使用以下代码从我的 XML 中读取 "BuyerID" 时,它抛出一个 InvalidOperationException,其中 ReadElementContentAsString method is not supported on node type None. Line 1, Position 634: http://pastebin.com/Lu4mKtwq

在这一行:

order.CustomerID = reader.ReadElementContentAsString();

我的源代码:http://pastebin.com/JyTz8x0G

这是我正在使用的XML:

XML 在文本中:

<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>

我正在使用的类:

实际上正确读取了客户 ID,它是引发异常的下一行。 你的错误在这行代码:

reader.ReadToFollowing("Instructions");

原因是 xml 不包含元素 Instructions。 您可以通过不丢弃 ReadToFollowing

的结果来改进您的代码
if (reader.ReadToFollowing("Instructions"))
    reader.ReadElementContentAsString();

ReadElementContentAsString方法读取当前节点后移动到下一个节点。 所以在你的情况下有下面的代码

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

现在代码已经在OrderID了,所以不要再去读了。 而是执行类似以下代码的操作:

        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);
            }
        }

还要确保您的 xml 和您的模型匹配。