2017-10-10 62 views
0

我在这个问题上看到了很多贴子,但似乎无法让我的C#代码正常工作。如何在添加新元素之前检查C#中是否存在XML元素?

基本上,我有一个XML文档,其中包含称为“颜色”的元素,我希望我的函数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 

回答

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

NUF,非常感谢你抽出时间来审查并纠正我的代码的时间。我的代码现在工作完美! – newToJava