C# 查找唯一的元素值并使用组号创建/标记节点

C# 查找唯一的元素值并使用组号创建/标记节点,c#,xml,xmlreader,xmlwriter,C#,Xml,Xmlreader,Xmlwriter,让我再解释一遍 例如,如果我们有一个db表,我们查询一些列,并将这些列中的所有值相加,生成一个唯一键,将其保存为一个新列,并用数字更新另一个新列。再次循环,如果其他列值的组合与前一列值重复,则使用与前一个编号相同的值更新第二列,否则更新下一个序列号。我必须在xml文件中完成 e-g } 该程序读取所有值,但如何基于这些值同时将其写入同一xml文件。我的猜测是将Dictionary对象中的节点值组合保存为键,并将Stringbuilder sb值与其进行比较。如果在dictionary中找到,则不

让我再解释一遍

例如,如果我们有一个db表,我们查询一些列,并将这些列中的所有值相加,生成一个唯一键,将其保存为一个新列,并用数字更新另一个新列。再次循环,如果其他列值的组合与前一列值重复,则使用与前一个编号相同的值更新第二列,否则更新下一个序列号。我必须在xml文件中完成

e-g

}

该程序读取所有值,但如何基于这些值同时将其写入同一xml文件。我的猜测是将Dictionary对象中的节点值组合保存为键,并将Stringbuilder sb值与其进行比较。如果在dictionary中找到,则不要在dictionary中创建新项,而是获取dictionary的值并以xml进行更新,但如何更新?请帮忙

谢谢


QF

好的,最后我使用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);
    }
因此,我们可以根据需要更改此处的节点名称。但是我的问题成功地解决了

享受

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