2014-08-29 64 views
1

让我再解释一遍。找到唯一的元素值并用组号码创建/标记节点

例如,如果我们有一个数据库表,我们查询了一些列增加了这些列的所有值,使一个唯一的密钥,并保存新的列和更新另一个新的列了一些。再次循环,如果其他列值的组合与前一个值相同,则使用与前一个数字相同的值更新第二列,否则更新下一个序列号。我必须在xml文件中完成它。 e-g。

e-g。

Combinatin of 
values from 
different nodes  Value 
---------------  -------- 
A-B-C-D-E    1 
A-B-C-D-F    2 
A-B-C-D-G    3 
A-B-C-D-E    1 



    namespace XMLdemo2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      StringBuilder sb = new StringBuilder(); 
// will use this dictionary object to store and compare node values 
      Dictionary<String, String> Rxml = new Dictionary<string, string>(); 

     String rdsName = ""; 
     String rdrValue = ""; 

     using (XmlReader reader = mlReader.Create(@"C:\Development\XML\Batch1823.xml")) 
     { 
      while (reader.Read()) 
      { 
       switch (reader.NodeType) 
       { 
        case XmlNodeType.Element: 
          reader.ReadToFollowing("Machine"); 
          reader.MoveToAttribute("machineId"); 
          rdsName = reader.Name; 
          rdrValue = reader.Value; 
          sb.Append(rdsName).Append("=").Append(rdrValue); 

          reader.ReadToFollowing("Rod"); 
          reader.MoveToAttribute("finalReference"); 
          rdsName = reader.Name; 
          rdrValue = reader.Value; 
          sb.Append(rdsName).Append("=").Append(rdrValue); 

          reader.MoveToAttribute("color"); 
          rdsName = reader.Name; 
          rdrValue = reader.Value; 
          sb.Append(rdsName).Append("=").Append(rdrValue); 

          reader.MoveToAttribute("length"); 
          rdsName = reader.Name; 
          rdrValue = reader.Value; 
          sb.Append(rdsName).Append("=").Append(rdrValue); 

          reader.ReadToFollowing("Piece"); 
          reader.MoveToAttribute("angle"); 
          rdsName = reader.Name; 
          rdrValue = reader.Value; 
          sb.Append(rdsName).Append("=").Append(rdrValue); 

          reader.MoveToAttribute("angleA"); 
          rdsName = reader.Name; 
          rdrValue = reader.Value; 
          sb.Append(rdsName).Append("=").Append(rdrValue); 

          reader.MoveToAttribute("angleB"); 
          rdsName = reader.Name; 
          rdrValue = reader.Value; 
          sb.Append(rdsName).Append("=").Append(rdrValue); 

          reader.ReadToFollowing("Operations"); 
          if (reader.ReadToDescendant("Operation")) 
          { 
           do 
           { 
            reader.MoveToAttribute("name"); 
            rdsName = reader.Name; 
            rdrValue = reader.Value; 
            sb.Append(rdsName).Append("=").Append(rdrValue); 

            reader.MoveToAttribute("X"); 
            rdsName = reader.Name; 
            rdrValue = reader.Value; 
            sb.Append(rdsName).Append("=").Append(rdrValue); 
           } while (reader.ReadToNextSibling("Operation")); 
          } 

         break; 

        default: 
         break; 
       } 
      } 
     } 

     Console.ReadKey(); 
    } 
} 

}

这个程序读取所有值,但如何将其在同一时间,以在此基础上值相同的XML文件写。我的猜测是将这个节点值的组合保存在Dictionary对象中作为关键字,并将Stringbuilder的sb值与它进行比较。如果在字典中找到,那么不要在字典中创建新的项目,但获取字典的值,并在xml中更新,但如何?请帮忙。

感谢

QF

回答

0

OK最后我使用XmlDocument的得到了我的解决方案。仍在尝试使用LINQ to xml来查找另一个解决方案。

这是它。

 static void Test(String _xmlFilename) 
    { 
     //string _path = @"C:\Development\XML\Batch1823.xml"; 
     String _path = _xmlFilename; 

     XmlDocument xDoc = new XmlDocument(); 
     Dictionary<string, int> _marks = new Dictionary<string, int>(); 
     int _markCounter = 0; 
     xDoc.Load(_path); 

     foreach(XmlNode xRod in xDoc.SelectNodes("/ProductionLot/ProductionSet/Machine/Rod")) 
     { 
      String _finalRef = xRod.Attributes.GetNamedItem("finalReference").Value; 
      String _color = xRod.Attributes.GetNamedItem("color").Value; 

      foreach (XmlNode xPiece in xRod.SelectNodes("Piece")) 
      { 
       String _length = xPiece.Attributes.GetNamedItem("length").Value; 
       String _angle = xPiece.Attributes.GetNamedItem("angle").Value; 
       String _angleA = xPiece.Attributes.GetNamedItem("angleA").Value; 
       String _angleB = xPiece.Attributes.GetNamedItem("angleB").Value; 
       String _operStr = ""; 

       foreach (XmlNode xOper in xPiece.SelectNodes("Operations/Operation")) 
       { 
        String _operName = xOper.Attributes.GetNamedItem("name").Value; 
        String _operXPos = xOper.Attributes.GetNamedItem("X").Value; 
        _operStr = _operStr + "//" + _operName + ":" + _operXPos; 
       } 

       String _pieceMark = _finalRef + "/" + _color + "/" + _length + "/" + _angle + "/" + _angleA + "/" + "/" + _operStr + "/" + _angleB; 
       String _markID = "0"; 

       if (!_marks.ContainsKey(_pieceMark)) 
       { 
        _markCounter += 1; 
        _marks.Add(_pieceMark, _markCounter); 
        _markID = _markCounter.ToString(); 
       } 
       else 
       { 
        _markID = _marks[_pieceMark].ToString(); 
       } 

       xPiece.Attributes.Append(xDoc.CreateAttribute("group")).Value = _markID; 
      } 
     } 

     xDoc.Save(_path); 
    } 

因此,我们可以根据我们的需要更改节点名称。但是我的问题已经成功完成。

享受....!