通过DOM方法

时间:2016-06-27 09:38:19

标签: c# xml dom xml-parsing formatexception

我刚刚开始学习SAX / Stream以及用于解析和处理XML文件的DOM方法。我的情况是我正在处理从我托管的FTP服务器检索到的给定XML文件中的信息,在将列表传递到我的DBManager之前将其放入单独的Array-lists中以将它们添加到数据库中。但是,在我想将它添加到数据库之前,我希望用户按下"检查按钮"在添加到数据库"之前确保信息确实正确。但这会以某种方式触发FormatException。我没有看到任何" DateTime"在我的任何类或变量使用中,这使我更加困惑。

编辑1:感谢Abdo Hussein,我意识到截图中说明的问题是我使用的是节点,而不是 node2 。但是,同样的问题也适用于以下行,也可能是后面的行。虽然它们仍然与节点处于同一循环中,而不是 node2

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

enter image description here

FormatException was unhandled

这是这个特定类的pastebin代码,因为它太长而且很混乱(我知道,我以后会把它留下来,我需要先通过它)http://pastebin.com/FewCm23W

以下是我正在处理的XML:

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

这些是要存储的不同类型信息的类:

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

2 个答案:

答案 0 :(得分:1)

DateTime只是一个疑难解答提示,并不意味着你有一个DateTime格式例外。

您在foreach中使用的是 node 变量,而不是 node2 ,请查看此内容。

请注意: -

1- FormatException:value不是有效格式的数字。

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

2-检查您的CultureInfo,因为格式不同取决于不同的&#34; CultureInfo&#34; s

答案 1 :(得分:1)

啊,我现在明白了。

问题是我正在转换的每个十进制变量的node2节点intead。

_kernel = new StandardKernel(
    new NinjectSettings{LoadExtensions = true}, 
    new FuncModule(), 
    new DynamicProxyModule()); // <~ this is what fixed it

问题2-我不知道整个foreach (XmlNode node2 in productList) { decimal qty = Convert.ToDecimal(node.ChildNodes[3].InnerText); decimal unitpx = Convert.ToDecimal(node.ChildNodes[4].InnerText); totalItemPrice += (qty * unitpx); } 被认为是一个子节点。因此,将InvoiceItem[4]换成[5][5]工作。

[6]