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); }
// проверка атрибутов 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); } } }
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); } } }
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); }
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); }
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); }
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); }