예제 #1
0
        private bool removeElement(XMLCompareChangeItem changeItem)
        {
            // найти в назначении удаляемый элемент
            XElement xElement = findElement(_xDocDest, changeItem.Names);

            if (xElement == null)
            {
                _errMsg = "Not found element '" + getPathFromList(changeItem.Names) + "' in destination XML-document for REMOVE";
                return(false);
            }

            xElement.Remove();

            return(true);
        }
예제 #2
0
        // проверка атрибутов
        private void compareAttributes(XElement xESrc, XElement xEDst)
        {
            // - удаление
            List <string> delElements = xEDst.Attributes().Select(e => e.Name.LocalName).Except(xESrc.Attributes().Select(e => e.Name.LocalName)).ToList();

            foreach (string item in delElements)
            {
                XMLCompareChangeItem newItem = new XMLCompareChangeItem();
                newItem.SetNamesFromXElement(xEDst);
                newItem.AttrName = item;
                newItem.Result   = XMLCompareResultEnum.Remove;
                _changes.Add(newItem);
            }

            XAttribute curAtr;

            // - цикл по атрибутам в Source
            foreach (XAttribute xAttrSrc in xESrc.Attributes())
            {
                // есть атрибут
                if (xEDst.Attributes(xAttrSrc.Name).Count() > 0)
                {
                    curAtr = xEDst.Attribute(xAttrSrc.Name);
                    if (xAttrSrc.Value != curAtr.Value)
                    {
                        XMLCompareChangeItem newItem = new XMLCompareChangeItem();
                        newItem.SetNamesFromXElement(xESrc);
                        newItem.AttrName = curAtr.Name.LocalName;
                        newItem.Value    = xAttrSrc.Value;
                        newItem.Result   = XMLCompareResultEnum.ChangeValue;
                        _changes.Add(newItem);
                    }
                }
                // добавить атрибут
                else
                {
                    XMLCompareChangeItem newItem = new XMLCompareChangeItem();
                    newItem.SetNamesFromXElement(xESrc);
                    newItem.AttrName = xAttrSrc.Name.LocalName;
                    newItem.Result   = XMLCompareResultEnum.AddNew;
                    _changes.Add(newItem);
                }
            }
        }
예제 #3
0
        private void compareXElements(XElement xESrc, XElement xEDst)
        {
            // проверка атрибутов
            compareAttributes(xESrc, xEDst);

            // и вложенных элементов
            XElement curEl;
            // удаление элементов из Dest
            List <string> delElements = xEDst.Elements().Select(e => e.Name.LocalName).Except(xESrc.Elements().Select(e => e.Name.LocalName)).ToList();

            foreach (string item in delElements)
            {
                XMLCompareChangeItem newItem = new XMLCompareChangeItem();
                newItem.SetNamesFromXElement(xEDst.Element(item));
                newItem.Result = XMLCompareResultEnum.Remove;
                _changes.Add(newItem);
            }

            // цикл по элементам в Source
            // проверяются только уникальные элементы
            foreach (XElement xSrcElement in xESrc.Elements())
            {
                int cntEls = xEDst.Elements(xSrcElement.Name).Count();

                // добавить в Dest новый элемент
                if (cntEls == 0)
                {
                    XMLCompareChangeItem newItem = new XMLCompareChangeItem();
                    newItem.SetNamesFromXElement(xSrcElement);
                    newItem.Result = XMLCompareResultEnum.AddNew;
                    _changes.Add(newItem);
                }

                // проверяются только уникальные элементы
                else if (cntEls == 1)
                {
                    curEl = xEDst.Element(xSrcElement.Name);
                    compareXElements(xSrcElement, curEl);
                }
            }
        }
예제 #4
0
        private bool addNewAttribute(XMLCompareChangeItem changeItem)
        {
            // в источнике:
            // - найти элемент
            XElement xeSrc = findElement(_xDocSrc, changeItem.Names);

            if (xeSrc == null)
            {
                _errMsg = "Not found element '" + getPathFromList(changeItem.Names) + "' in source XML-document which ADD";
                return(false);
            }
            // - найти атрибут, который надо вставить и его индекс
            int xaSrcAfterIndex = findAttributeIndex(xeSrc, changeItem.AttrName);

            if (xaSrcAfterIndex < 0)
            {
                _errMsg = "Not found attribute '" + changeItem.AttrName + "' in the element '" + getPathFromList(changeItem.Names) + "' in the destination XML-document which ADD";
                return(false);
            }
            XAttribute xaNew = xeSrc.Attributes().ElementAt(xaSrcAfterIndex);

            // в назначении:
            XElement xeDest = findElement(_xDocDest, changeItem.Names);

            if (xeDest == null)
            {
                _errMsg = "Not found element '" + getPathFromList(changeItem.Names) + "' in destination XML-document for ADD attribute to";
                return(false);
            }

            List <XAttribute> attrs = xeDest.Attributes().ToList();

            xeDest.RemoveAttributes();
            attrs.Insert(xaSrcAfterIndex, xaNew);
            xeDest.Add(attrs);

            return(true);
        }
예제 #5
0
        private bool addNewElement(XMLCompareChangeItem changeItem)
        {
            // найти в источнике добавляемый элемент
            XElement xeAfter = findElement(_xDocSrc, changeItem.Names);

            if (xeAfter == null)
            {
                _errMsg = "Not found element '" + getPathFromList(changeItem.Names) + "' in source XML-document which ADD";
                return(false);
            }

            // добавить в addItems все элементы перед добавляемым, там могут быть, напр. комментарии
            List <XNode> addItems = new List <XNode>();

            addItems.Add(xeAfter);
            XNode srcNodeAfter = xeAfter.PreviousNode;

            while ((srcNodeAfter != null) && !(srcNodeAfter is XElement))
            {
                addItems.Insert(0, srcNodeAfter);
                srcNodeAfter = srcNodeAfter.PreviousNode;
            }

            // найти в _xDocDest элемент curNode, после которого надо вставить элементы из addItems
            List <string> destParentPath = getNamesFromXElement((XElement)srcNodeAfter);
            XElement      xeDestAfter    = findElement(_xDocDest, destParentPath);

            if (xeDestAfter == null)
            {
                _errMsg = "Not found element '" + getPathFromList(destParentPath) + "' in destination XML-document for ADD";
                return(false);
            }

            // и вставить после xeDestAfter элементы из addItems
            xeDestAfter.AddAfterSelf(addItems);

            return(true);
        }
예제 #6
0
        private bool changeAttributeValue(XMLCompareChangeItem changeItem)
        {
            // найти в назначении элемент, в котором изменяется атрибут
            XElement xElement = findElement(_xDocDest, changeItem.Names);

            if (xElement == null)
            {
                _errMsg = "Not found element '" + getPathFromList(changeItem.Names) + "' in destination XML-document for CHANGE attribute value in";
                return(false);
            }

            // найти изменяемый атрибут
            XAttribute xAttribute = findAttribute(xElement, changeItem.AttrName);

            if (xAttribute == null)
            {
                _errMsg = "Not found attribute '" + changeItem.AttrName + "' in the element '" + getPathFromList(changeItem.Names) + "' in destination XML-document for CHANGE its value";
                return(false);
            }

            xAttribute.Value = changeItem.Value;

            return(true);
        }
예제 #7
0
        private bool removeAttribute(XMLCompareChangeItem changeItem)
        {
            // найти в назначении элемент, в котором удаляется атрибут
            XElement xElement = findElement(_xDocDest, changeItem.Names);

            if (xElement == null)
            {
                _errMsg = "Not found element '" + getPathFromList(changeItem.Names) + "' in destination XML-document for REMOVE attribute from";
                return(false);
            }

            // найти удаляемый атрибут
            XAttribute xaDel = findAttribute(xElement, changeItem.AttrName);

            if (xaDel == null)
            {
                _errMsg = "Not found attribute '" + changeItem.AttrName + "' in the element '" + getPathFromList(changeItem.Names) + "' in destination XML-document for REMOVE";
                return(false);
            }

            xaDel.Remove();

            return(true);
        }