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

时间:2014-08-29 17:25:26

标签: c# xml xmlreader xmlwriter

让我再解释一下。

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

E-克

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

1 个答案:

答案 0 :(得分:0)

好的,最后我使用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);
    }

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

享受....!