C# 在xml中创建新节点

C# 在xml中创建新节点,c#,xml,C#,Xml,有人能给我一个指针,说明这个代码有什么问题吗。 其思想是,如果找到匹配项,它将查看xml文件,并使用新数据更新现有节点,如果未找到匹配项,它将使用所需数据创建新节点。 但是,如果我删除创建新节点的代码,而不是只更新节点,它将创建一个副本,它将按其应该的方式更新。这是环路的问题吗 ListBoxItem mySelectedItem = listBox5.SelectedItem as ListBoxItem; string image = mySelectedItem.Cont

有人能给我一个指针,说明这个代码有什么问题吗。 其思想是,如果找到匹配项,它将查看xml文件,并使用新数据更新现有节点,如果未找到匹配项,它将使用所需数据创建新节点。 但是,如果我删除创建新节点的代码,而不是只更新节点,它将创建一个副本,它将按其应该的方式更新。这是环路的问题吗

 ListBoxItem mySelectedItem = listBox5.SelectedItem as ListBoxItem;
        string image = mySelectedItem.Content.ToString();
        XmlDocument xXMLTVDoc = new XmlDocument();
        xXMLTVDoc.Load(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + (@"\Media Center Themer") + @"\MCTDefault.xml");
        XmlNodeList xNodes = xXMLTVDoc.SelectNodes(@"/MediaCenterThemer/Resources/Rcdata/Resource");
        XmlNode xNod = xXMLTVDoc.SelectSingleNode(@"/MediaCenterThemer/Resources/Rcdata/Resource");
        string text1 = "";

        if (listBox5.SelectedItem == null)
        {
            System.Windows.MessageBox.Show("Please select image.", "No Image Selected", MessageBoxButton.OK);
        }
        else if (this.listBox5.SelectedItem != null)
        {
            OpenFileDialog1.Title = "Select your Image";
            OpenFileDialog1.Filter = "PNG|*.png|All files|*.*";
            OpenFileDialog1.RestoreDirectory = true;
            OpenFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);

            System.Windows.Forms.DialogResult result = OpenFileDialog1.ShowDialog();

            if (result == System.Windows.Forms.DialogResult.OK)
            {
                text1 = OpenFileDialog1.FileName;
                try
                {
                    foreach (XmlNode xNode in xNodes)
                    {
                        if (image.Equals("COMMON.BACKGROUND.PNG"))
                        {
                            if (xNode.Attributes[0].Value == "COMMON.BACKGROUND.PNG")
                            {
                                xNode.FirstChild.Attributes[0].Value = text1;
                                xXMLTVDoc.Save(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + (@"\Media Center Themer") + @"\MCTDefault.xml");
                                break;
                            }
                            else if (xNode.Attributes[0].Value != mySelectedItem.Content.ToString())
                            {
                                XmlElement node = xXMLTVDoc.CreateElement("Resource");
                                node.SetAttribute("Id", mySelectedItem.Content.ToString());
                                XmlNode parent1 = xNod.ParentNode;
                                XmlElement nodeTitle = xXMLTVDoc.CreateElement("Replace");
                                nodeTitle.SetAttribute("File", text1);
                                node.AppendChild(nodeTitle);
                                parent1.AppendChild(node);
                                xXMLTVDoc.Save(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + (@"\Media Center Themer") + @"\MCTDefault.xml");
                            }
                        }

                        else if (image.Equals("COMMON.ANIMATED.BACKGROUND.PNG"))
                        {
                            if (xNode.Attributes[0].Value == "COMMON.ANIMATED.BACKGROUND.PNG")
                            {
                                xNode.FirstChild.Attributes[0].Value = text1;
                                xXMLTVDoc.Save(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + (@"\Media Center Themer") + @"\MCTDefault.xml");
                                break;
                            }
                            else if (xNode.Attributes[0].Value != mySelectedItem.Content.ToString())
                            {
                                XmlElement node = xXMLTVDoc.CreateElement("Resource");
                                node.SetAttribute("Id", mySelectedItem.Content.ToString());
                                XmlNode parent1 = xNod.ParentNode;
                                XmlElement nodeTitle = xXMLTVDoc.CreateElement("Replace");
                                nodeTitle.SetAttribute("File", text1);
                                node.AppendChild(nodeTitle);
                                parent1.AppendChild(node);
                                xXMLTVDoc.Save(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + (@"\Media Center Themer") + @"\MCTDefault.xml");
                            }
                        }
                    }
                }

                catch (Exception)
                {
                    MessageBox.Show("Could Not assign Image");
                }
以下是xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Change the main colors of Media Center to shades of green -->
<MediaCenterThemer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="MCTSchema.xsd">
<TextFormat>
<!-- Color: OffWhite -->
<Text Color="rgb(242,242,242)">
  <Replace Color="rgb(130,240,130)" />
</Text>
<!-- Color: LightBlue -->
<Text Color="rgb(151,217,255)">
  <Replace Color="rgb(80,200,80)" />
</Text>
<!-- Color: MediumBlue -->
<Text Color="rgb(2,166,212)">
  <Replace Color="rgb(10,160,10)" />
</Text>
</TextFormat>
<Legacy>
<!-- Legacy strings (settings). Color: OffWhite -->
<String Color="rgb(242,242,242)">
  <Replace Color="rgb(115,200,110)" />
</String>
<!-- Legacy strings (settings). Color: LightBlue -->
<String Color="rgb(151,217,255)">
  <Replace Color="rgb(70,150,60)" />
</String>
</Legacy>
<Resources>
<Rcdata>
<!-- Picture Resources. Modification of the default background -->
<Resource Id="COMMON.BACKGROUND.PNG">
<Replace File="C:\Users\Public\Pictures\CITV.png" />
</Resource>
<Resource Id="COMMON.ANIMATED.BACKGROUND.PNG">
<Replace File="Theme\bkg-demo.jpg"/>
</Resource>
</Rcdata>
</Resources>
</MediaCenterThemer>

谢谢

你可以这样做

     bool doesNodeExist = false;
     foreach (XmlNode xNode in xNodes)
                    {
                        if (image.Equals("COMMON.BACKGROUND.PNG"))
                        {
                            if (xNode.Attributes[0].Value == "COMMON.BACKGROUND.PNG")
                            {
doesNodeExist = true;
                                xNode.FirstChild.Attributes[0].Value = text1;
                                xXMLTVDoc.Save(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + (@"\Media Center Themer") + @"\MCTDefault.xml");
                                break;
                            }
                        }
                   }
       if(!doesNodeExist)
      {
          //Create Logic here...
      }

这是哪种编程语言?重新标记为C。但不是.NET程序员,所以我想我帮不了你。如果没有人给出答案,我会很惊讶,我稍后会看一看。如果您还包括您使用的xml文件的简化版本,我可以研究一下。谢谢,现在包括xml.Hmm。。我在复制你的问题时遇到了麻烦。尽管我建议您看看在尝试创建新的xml节点时会发生什么。我想到的一件事是,在创建一个新节点并保存xml文件之后,会发生的事情是,在xNodes列表中获得一个额外的节点,这将导致foreach循环中的一个额外迭代。