C#XmlReader ReadElementContentAsString()InvalidOperationException

时间:2016-07-01 04:42:03

标签: c# xml invalidoperationexception

我尝试阅读特定的XML,将必要的信息保存到两个不同的类OrderOrderDetail中。但是,当我尝试阅读" BuyerID"通过以下代码从我的XML中,它使用InvalidOperationExceptionhttp://pastebin.com/Lu4mKtwq

向我投掷ReadElementContentAsString method is not supported on node type None. Line 1, Position 634

在这一特定行:

order.CustomerID = reader.ReadElementContentAsString();

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

这是我正在使用的XML:

Order xml that contains information for order and order detail class 文本中的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>

我正在使用的课程: Order and Order detail classes

2 个答案:

答案 0 :(得分:2)

读取当前节点后的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和您的模型匹配。

答案 1 :(得分:0)

客户ID实际上是正确读取的,它是下面的行引发异常。 您的错误出现在以下代码行中:

reader.ReadToFollowing("Instructions");

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

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