我在这个问题上看过很多帖子,但似乎无法使我的C#代码正常工作。
基本上,我有一个XML文档,其中包含名为“color”的元素,我希望我的函数addColor在xml中添加新元素和值(如果它尚不存在)。我知道硬编码是不好的做法,我打算改变它,我只需要先解决这个问题。
我的问题是,为什么我的代码不会循环遍历每个“颜色”元素,并且一旦当前元素值与函数的输入值匹配就会中断?
以下是我当前的XML文件:
<?xml version="1.0"?>
<configuration>
<color>Black</color>
<color>Brown</color>
<color>Gray</color>
<color>Orange</color>
<color>Pink</color>
<color>Purple</color>
<color>Red</color>
<color>White</color>
<color>Yellow</color>
</configuration>
我的代码如下所示:
public void addColor(string newColor)
{
XmlDocument document = new XmlDocument();
//adds child element to Make element
try
{
document.Load("C:\\Users\\tobiajj1\\Desktop\\XML_C#\\testDetailManager\\original.xml");
XmlNode root = document.DocumentElement;
XmlNodeList nodes = root.SelectNodes("configuration");
foreach (XmlNode node in nodes)
{
if (node.Value == newColor)
{
break;
}
}
XmlElement childElement = document.CreateElement("color");
childElement.InnerText = newColor;
XmlNode parentNode = document.SelectSingleNode("configuration");
parentNode.InsertAfter(childElement, parentNode.LastChild);
document.Save("C:\\Users\\tobiajj1\\Desktop\\XML_C#\\testDetailManager\\original.xml");
}//try
catch (XmlException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Exception object Line, pos: (" + e.LineNumber + "," + e.LinePosition + ")");
}//end catch
}//end addMake function
答案 0 :(得分:1)
这将解决它。由于存在多个问题,我将解释直接作为注释放在代码中。
public void addColor(string newColor)
{
XmlDocument document = new XmlDocument();
//adds child element to Make element
try
{
document.Load("C:\\Users\\tobiajj1\\Desktop\\XML_C#\\testDetailManager\\original.xml");
XmlNode root = document.DocumentElement;
// "configuration" node is what you already have in "root" variable.
// You want to select "color" nodes that are children of this root element
XmlNodeList nodes = root.SelectNodes("color");
//XmlNodeList nodes = root.SelectNodes("configuration");
foreach (XmlNode node in nodes)
{
// node.Value returns null for node elements - see
// https://docs.microsoft.com/en-us/dotnet/api/system.xml.xmlnode.value?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DEN-US%26k%3Dk(System.Xml.XmlNode.Value);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.7);k(DevLang-csharp)%26rd%3Dtrue&view=netframework-4.7
// You must use node.InnerText instead
if (node.InnerText == newColor)
//if (node.Value == newColor)
{
// BREAK would only exit from foreach loop, but method
// would continue execution immediately after foreach
// i.e. with document.CreateElement("color");
// and new color node would be added regardless of
// whether it already exists or not.
// RETURN exits method completely
return;
//break;
}
}
XmlElement childElement = document.CreateElement("color");
childElement.InnerText = newColor;
XmlNode parentNode = document.SelectSingleNode("configuration");
parentNode.InsertAfter(childElement, parentNode.LastChild);
document.Save("C:\\Users\\tobiajj1\\Desktop\\XML_C#\\testDetailManager\\original.xml");
}//try
catch (XmlException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Exception object Line, pos: (" + e.LineNumber + "," + e.LinePosition + ")");
}//end catch
}//end addMake function
您也可以使用LINQ to XML代替,这通常会产生更短且更易读的代码:
public static void addColor2(string newColor)
{
var document = XDocument.Load("C:\\Users\\tobiajj1\\Desktop\\XML_C#\\testDetailManager\\original.xml");
if(!document.Root.Elements("color").Any(element => element.Value == newColor))
{
document.Root.Add(new XElement("color", newColor));
document.Save("C:\\Users\\tobiajj1\\Desktop\\XML_C#\\testDetailManager\\original.xml");
}
}