我正在尝试更新现有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;
}
}
}
}
我能够得到我想要的结果。