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