在添加新元素之前,如何检查C#中是否存在XML元素?

在添加新元素之前,如何检查C#中是否存在XML元素?,c#,xml,C#,Xml,我看过很多关于这个问题的帖子,但似乎无法让我的C#代码正常工作 基本上,我有一个XML文档,其中包含名为“color”的元素,我希望我的函数addColor为XML添加一个新元素和值(如果它不存在的话)。我知道硬编码是一种不好的做法,我计划改变这一点,我只需要先解决这个问题 我的问题是,为什么我的代码不在每个“color”元素中循环并在当前元素值和函数的输入值之间匹配时中断 下面是我当前的XML文件: <?xml version="1.0"?> <configuration&

我看过很多关于这个问题的帖子,但似乎无法让我的C#代码正常工作

基本上,我有一个XML文档,其中包含名为“color”的元素,我希望我的函数addColor为XML添加一个新元素和值(如果它不存在的话)。我知道硬编码是一种不好的做法,我计划改变这一点,我只需要先解决这个问题

我的问题是,为什么我的代码不在每个“color”元素中循环并在当前元素值和函数的输入值之间匹配时中断

下面是我当前的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;

        // "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

您也可以改为使用,这通常会导致代码更短、可读性更强:

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");
    }
}

Nuf,非常感谢您花时间查看并更正我的代码。我的代码现在工作得很好@请把它标为答案。这么晚了,但这是必要的
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");
    }
}