2014-08-29 3 views
1

다시 설명해 드리겠습니다.고유 한 요소 값을 찾고 그룹 번호가있는 노드를 만들거나 표시합니다.

예를 들어 db 테이블이있는 경우 일부 열을 쿼리하고 해당 열의 모든 값을 합하여 고유 한 키를 만들고 새 열을 저장하고 다른 새 열을 숫자로 업데이트합니다. 다시 반복하고 다른 열 값의 조합이 이전 값과 중복되면 두 번째 열을 이전 값과 동일한 값으로 업데이트하고 그렇지 않으면 다음 시퀀스 번호를 업데이트합니다. 나는 XML 파일에서 그것을해야만한다.

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

여기서는 필요에 따라 노드 이름을 변경할 수 있습니다. 하지만 내 문제가 성공적으로 완료됩니다.

즐기십시오! ....!

관련 문제