2010-11-30 10 views
0

内部に複数の要素を持つXML文書を作成したいと思います。フォーマットは次のようなものでなければなりません:複数のxml要素をCで挿入する

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

すべてがデータをフェッチする最初のループの後にOKですが、第二のループが完了したら、私はこれ持っている:だからのすべてのラウンド後

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

を私は空の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.Read()と冗長であるため、rdr.HasRowsは必要ありません。rdr.Read()は冗長なので、別の行が見つかったときにtrueを返します。 – Zachary

答えて

4

ここでid、titleなどのノードを作成しますか?新しいノードを作成する代わりに、これらを再利用しているように見えます。そのため、正しく機能していません。

子ノードを再利用する場合、子ノードを現在のノードから削除して新しいノードに挿入するため、空の要素が表示されます。

ここでもthis questionを確認してください。基本的には正確に同じ問題です。

0

この種のことを行うXMLSerializerクラスがSystem.XML.Serialisation名前空間を使用することを検討しましたか? 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

+1

バージョンに依存しないリンク:http://msdn.microsoft.com/en-us /library/182eeyhh.aspx –

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; } 
    } 
} 
関連する問題