Найти уникальные значения элементов и создать / пометить узел номером группы

1

Позвольте мне объяснить это снова.

Например, если у нас есть таблица db, мы запрашиваем некоторые столбцы и добавляем все значения в эти столбцы, чтобы создать уникальный ключ и сохранить новые столбцы и обновить новые столбцы с числом. Петля снова, и если снова комбинация других значений столбца повторяется с предыдущей, то обновите второй столбец с тем же значением, что и предыдущий номер, иначе следующий порядковый номер. Я должен сделать это в XML файле.

например.

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 как ключ и сравнить значение sb Stringbuilder с ним. если он найден в словаре, то не создавайте новый элемент в словаре, а получите значение словаря и обновления в xml, но как? пожалуйста помоги.

благодаря

QF

Теги:
xmlwriter
xmlreader

1 ответ

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

Поэтому мы можем изменить имена узлов здесь в соответствии с нашей потребностью. Но моя проблема решена успешно.

Наслаждаться....!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню