2010-11-30 82 views
0

我想創建包含多個元素的XML文檔。格式應該是這樣的:在c中插入多個xml元素#

<Item> 
    <Id>2276138</Id> 
    <Title>92907-03100-00 WASHER, CHAIN</Title> 
    <Link>http://www.mywebsite.com/Product.aspx?ProductId=2453575&SKU=92907-03100-00</Link> 
    <Price>0.0000</Price> 
    <Description>WASHER, CHAIN (92907-03100-00)</Description> 
    <Condition>New</Condition> 
    <Brand /> 
    <Product_Type /> 
    <Availability>In Stock</Availability> 
    <Manufacturer>Suzuki</Manufacturer> 
    </Item> 

一切都是獲取數據上的第一圈後確定,但一旦第二循環完成,我有這樣的:

<Item></Item> 
    <Item> 
     <Id>2276138</Id> 
     <Title>92907-03100-00 WASHER, CHAIN</Title> 
     <Link>http://www.mywebsite.com/Product.aspx?ProductId=2453575&SKU=92907-03100-00</Link> 
     <Price>0.0000</Price> 
     <Description>WASHER, CHAIN (92907-03100-00)</Description> 
     <Condition>New</Condition> 
     <Brand /> 
     <Product_Type /> 
     <Availability>In Stock</Availability> 
     <Manufacturer>Suzuki</Manufacturer> 
     </Item> 

每一輪之後,所以提取我得到空的項目元素,只是最後一個元素被填充。 下面是循環代碼:

while (rdr.Read()) 
       { 
        if (rdr.HasRows) 
        { 
         XmlElement part = docOrders.CreateElement("Item"); 
         id.InnerText = rdr[0].ToString(); 
         part.AppendChild(id); 
         title.InnerText = rdr[1].ToString(); 
         part.AppendChild(title); 
         link.InnerText = rdr[2].ToString(); 
         part.AppendChild(link); 
         price.InnerText = rdr[3].ToString(); 
         part.AppendChild(price); 
         desc.InnerText = rdr[4].ToString(); 
         part.AppendChild(desc); 
         cond.InnerText = rdr[5].ToString(); 
         part.AppendChild(cond); 
         brand.InnerText = rdr[6].ToString(); 
         part.AppendChild(brand); 
         productType.InnerText = rdr[7].ToString(); 
         part.AppendChild(productType); 
         availability.InnerText = rdr[8].ToString(); 
         part.AppendChild(availability); 
         manufacturer.InnerText = rdr[9].ToString(); 
         part.AppendChild(manufacturer);       
         root.AppendChild(part); 
        } 
       } 
       rdr.Close(); 
      } 

我怎樣才能解決這個問題,這樣的數據將被正確獲取? 在此先感謝

+0

只是一個參考,但您不需要rdr.HasRows,因爲它與rdr.Read()是多餘的,它只在發現並返回另一行時返回true。 – Zachary 2010-11-30 21:59:09

回答

4

你在哪裏創建ID,標題等節點?看起來你正在重複使用這些而不是創建新節點,這就是爲什麼它不能正常工作。

如果您正在重用子節點,它將從當前節點中刪除它並將其插入新節點,這就是爲什麼您會看到空元素。

此外檢查this question在這裏,基本上相同的確切問題。

0

你有沒有考慮過使用System.XML.Serialisation命名空間,它有一個XMLSerializer類,它對你來說很適合做這種事情?這裏有一些MSDN文檔 - http://msdn.microsoft.com/en-us/library/swxzdhc0.aspx - 深入一些很好的例子,以及這裏有一個簡短的說明足夠的基礎知識 - http://support.microsoft.com/kb/815813

+0

這也可能有所幫助 - http://msdn.microsoft.com/en-us/library/182eeyhh%28VS.85%29.aspx – RichardW1001 2010-11-30 21:24:23

2

你還沒有說你使用的是哪個版本的.NET。如果使用.NET 3.5或更高版本,那麼我會建議使用LINQ to XML,尤其是如果您可以從查詢中獲取強類型數據。例如:

using System; 
using System.Linq; 
using System.Xml.Linq; 

public class Testing 
{ 
    private void Main() 
    { 
     var items = new[] 
         { 
          new DataItem 
           { 
            Id = 2276138, 
            Title = "92907-03100-00 WASHER, CHAIN", 
            Link = 
             new Uri(
             "http://www.mywebsite.com/Product.aspx?ProductId=2453575&SKU=92907-03100-00"), 
            Price = 0.0M, 
            Description = "WASHER, CHAIN (92907-03100-00)", 
            Condition = "New", 
            Availability = "In Stock", 
            Manufacturer = "Suzuki" 
           }, 
          new DataItem 
           { 
            Id = 2276139, 
            Title = "92907-03100-01 WASHER, CHAIN", 
            Link = 
             new Uri(
             "http://www.mywebsite.com/Product.aspx?ProductId=2453575&SKU=92907-03100-00"), 
            Price = 0.0M, 
            Description = "WASHER, CHAIN (92907-03100-00)", 
            Condition = "New", 
            Availability = "In Stock", 
            Manufacturer = "Suzuki" 
           }, 
          new DataItem 
           { 
            Id = 2276140, 
            Title = "92907-03100-02 WASHER, CHAIN", 
            Link = 
             new Uri(
             "http://www.mywebsite.com/Product.aspx?ProductId=2453575&SKU=92907-03100-00"), 
            Price = 0.0M, 
            Description = "WASHER, CHAIN (92907-03100-00)", 
            Condition = "New", 
            Availability = "In Stock", 
            Manufacturer = "Suzuki" 
           }, 
         }; 
     var doc = new XDocument(
      new XElement(
       "Items", 
       from item in items 
       select 
        new XElement(
        "Item", 
        new XElement("Id", item.Id), 
        new XElement("Title", item.Title), 
        new XElement("Link", item.Link), 
        new XElement("Price", item.Price), 
        new XElement("Description", item.Description), 
        new XElement("Condition", item.Condition), 
        new XElement("Brand", item.Brand), 
        new XElement("Product_Type", item.ProductType), 
        new XElement("Availability", item.Availability), 
        new XElement("Manufacturer", item.Manufacturer)))); 
    } 

    public class DataItem 
    { 
     public int Id { get; set; } 
     public string Title { get; set; } 
     public Uri Link { get; set; } 
     public decimal Price { get; set; } 
     public string Description { get; set; } 
     public string Condition { get; set; } 
     public string Brand { get; set; } 
     public string ProductType { get; set; } 
     public string Availability { get; set; } 
     public string Manufacturer { get; set; } 
    } 
}