更新现有的xml节点会遇到麻烦

时间:2014-08-22 15:52:58

标签: c# asp.net xml

我正在尝试更新现有xml文档中的xml节点,但不是简单地用新信息覆盖现有节点,而是更新现有节点并创建具有重复信息的新节点。非常感谢任何帮助,并提前感谢。

   public void makeNode(string ProdName, string ProdUrl, string ID)
{
    string name = ProdName;
    string link = ProdUrl;
    string id = ID;
    string xmlFilePath = Server.MapPath("~/App_Data/NewProductsMenuList.xml");

    if (File.Exists(xmlFilePath))
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(xmlFilePath);
        XmlElement root = doc.DocumentElement;

        //TODO: Handle Duplicate Nodes

         XmlElement _products = doc.CreateElement("Product");
         root.AppendChild(_products);
         _products.SetAttribute("ProductName", name);
         _products.SetAttribute("ProductUrl", link);
         _products.SetAttribute("id", id);
         _products.SetAttribute("type", "text");


        XmlNodeList textNodes = doc.SelectNodes("//Product");
        if (textNodes != null)
        {
            foreach (XmlNode n in textNodes)
            {
                //if (n.Attributes["id"].Value != null)
                //{
                    if (n.Attributes["id"].Value == id)
                    {
                        n.Attributes["ProductName"].Value = name;
                        n.Attributes["ProductUrl"].Value = link;
                    }
                //}
                //else
                //{
                //    _products.SetAttribute("ProductName", name);
                //    _products.SetAttribute("ProductUrl", link);
                //    _products.SetAttribute("id", id);
                //    _products.SetAttribute("type", "text");
                //}
            }
        }


        doc.Save(xmlFilePath);

        SavedMessage.Visible = true;
        SavedMessage.Text = string.Format(SavedMessage.Text, LocaleHelper.LocalNow);
    }
}

编辑:为了澄清问题,这里是编辑之前的xml文档:

<Product ProductName="Memory Mate Photo Easels" ProductUrl="/Memory-Mate-Photo-Easel-Backs-8x10-P3626.aspx" id="1" type="text" />
<Product ProductName="Black Drape and Double V-Drapes" ProductUrl="/Black-Drape-and-Double-V-Drapes-P5430.aspx" id="2" type="text" />
<Product ProductName="CD/DVD Presentation Albums" ProductUrl="/CDDVD-Presentation-Albums-Cases-P5211.aspx" id="3" type="text" />

以下是编辑后的文件:

    <Product ProductName="Black Drape and Double V-Drapes" ProductUrl="/Black-Drape-and-Double-V-Drapes-P5430.aspx" id="1" type="text" />
  <Product ProductName="Memory Mate Photo Easels" ProductUrl="/Memory-Mate-Photo-Easel-Backs-8x10-P3626.aspx" id="2" type="text" />
  <Product ProductName="CD/DVD Presentation Albums" ProductUrl="/CDDVD-Presentation-Albums-Cases-P5211.aspx" id="3" type="text" />
  <Product ProductName="Black Drape and Double V-Drapes" ProductUrl="/Black-Drape-and-Double-V-Drapes-P5430.aspx" id="1" type="text" />
  <Product ProductName="Memory Mate Photo Easels" ProductUrl="/Memory-Mate-Photo-Easel-Backs-8x10-P3626.aspx" id="2" type="text" />
  <Product ProductName="CD/DVD Presentation Albums" ProductUrl="/CDDVD-Presentation-Albums-Cases-P5211.aspx" id="3" type="text" />

注意它确实更新了节点,但也创建了一组额外的节点,这就是我试图停止的行为。

编辑2:我解决了自己的问题。问题出在这个块中:

 XmlElement _products = doc.CreateElement("Product");
         root.AppendChild(_products);
         _products.SetAttribute("ProductName", name);
         _products.SetAttribute("ProductUrl", link);
         _products.SetAttribute("id", id);
         _products.SetAttribute("type", "text");


        XmlNodeList textNodes = doc.SelectNodes("//Product");
        if (textNodes != null)
        {
            foreach (XmlNode n in textNodes)
            {
                //if (n.Attributes["id"].Value != null)
                //{
                    if (n.Attributes["id"].Value == id)
                    {
                        n.Attributes["ProductName"].Value = name;
                        n.Attributes["ProductUrl"].Value = link;
                    }
                //}
                //else
                //{
                //    _products.SetAttribute("ProductName", name);
                //    _products.SetAttribute("ProductUrl", link);
                //    _products.SetAttribute("id", id);
                //    _products.SetAttribute("type", "text");
                //}
            }
        }

我把它更改为:

 if (root.IsEmpty)
             {
                 //Response.Write("I think I'm empty <br/>");
                 XmlElement _products = doc.CreateElement("Product");
                 root.AppendChild(_products);
                 _products.SetAttribute("ProductName", name);
                 _products.SetAttribute("ProductUrl", link);
                 _products.SetAttribute("id", id);
                 _products.SetAttribute("type", "text");
             }
             else
             {
                 XmlNodeList textNodes = doc.SelectNodes("//Product");
                 if (textNodes != null)
                 {
                     foreach (XmlNode n in textNodes)
                     {
                         if (n.Attributes["id"].Value == id)
                         {
                             //Response.Write("Found matching node! <br/>");
                             n.Attributes["ProductName"].Value = name;
                             n.Attributes["ProductUrl"].Value = link;
                         }
                     }
                 }
             }

我能够得到我想要的结果。

0 个答案:

没有答案