C# XmlReader ReadElementContentAsString() InvalidOperationException 异常
C# XmlReader ReadElementContentAsString() InvalidOperationException
我正在尝试读取特定的 XML,将必要的信息保存到两个不同的 类 Order
和 OrderDetail
中。但是,当我尝试使用以下代码从我的 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 和您的模型匹配。
我正在尝试读取特定的 XML,将必要的信息保存到两个不同的 类 Order
和 OrderDetail
中。但是,当我尝试使用以下代码从我的 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:
<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 和您的模型匹配。