public void Evaluate(int SpreadMax) { if (SpreadMax == 0) { return; } if (!Element.IsChanged && !ConfigChanged) { return; } Elements.SliceCount = SpreadMax; for (int i = 0; i < SpreadMax; i++) { var element = Element[i]; Elements[i] = element != null?GetElementsByName(element, ElementName) : XMLNodes.NoElements; } var allElements = Elements.SelectMany(spread => spread).ToArray(); foreach (var attributeInfo in AttributeInfos) { attributeInfo.AttributeOutputPin.SliceCount = allElements.Length; attributeInfo.AttributeExistsOutputPin.SliceCount = allElements.Length; int i = 0; foreach (var element in allElements) { var attributes = element.Attributes(attributeInfo.AttributeName); var attribute = attributes.FirstOrDefault(); attributeInfo.AttributeOutputPin[i] = attribute != null ? attribute.Value : ""; attributeInfo.AttributeExistsOutputPin[i] = attribute != null; i++; } } ConfigChanged = false; }
// method called each frame in vvvv public void Evaluate(int SpreadMax) { if (SpreadMax == 0) { return; } if (!Element.IsChanged && !ConfigChanged) { return; } Elements.SliceCount = SpreadMax; for (int i = 0; i < SpreadMax; i++) { var element = Element[i]; if (BaseElementName != null) { Elements[i] = element != null?GetElementsByXPathQuery(element, BaseElementName) : XMLNodes.NoElements; } } var allElements = Elements.SelectMany(spread => spread).ToArray(); // process attributes foreach (var attributeInfo in AttributeInfos) { attributeInfo.AttributeOutputPin.SliceCount = allElements.Length; attributeInfo.AttributeExistsOutputPin.SliceCount = allElements.Length; int i = 0; foreach (var element in allElements) { var attributes = element.Attributes(attributeInfo.AttributeName); var attribute = attributes.FirstOrDefault(); attributeInfo.AttributeOutputPin[i] = attribute != null ? attribute.Value : ""; attributeInfo.AttributeExistsOutputPin[i] = attribute != null; i++; } } // process content elements foreach (var contentElementInfo in ContentElementInfos) { contentElementInfo.ContentElementOutputPin.SliceCount = allElements.Length; contentElementInfo.ContentElementExistsOutputPin.SliceCount = allElements.Length; int i = 0; foreach (var element in allElements) { var elements = element.Elements(contentElementInfo.ContentElementName); var el = elements.FirstOrDefault(); contentElementInfo.ContentElementOutputPin[i] = el != null ? el.Value : ""; contentElementInfo.ContentElementExistsOutputPin[i] = el != null; i++; } } // process child elements foreach (var childElementInfo in ChildElementInfos) { childElementInfo.ChildElementOutputPin.SliceCount = allElements.Length; childElementInfo.ChildElementExistsOutputPin.SliceCount = allElements.Length; int i = 0; foreach (var element in allElements) { var elements = element.Elements(childElementInfo.ChildElementName); var el = elements.FirstOrDefault(); childElementInfo.ChildElementOutputPin[i] = el != null?GetElementByXPathQuery(element, childElementInfo.ChildElementName) : XMLNodes.NoElements.FirstOrDefault(); childElementInfo.ChildElementExistsOutputPin[i] = el != null; i++; } } ConfigChanged = false; }
// method called each frame in vvvv public void Evaluate(int SpreadMax) { //if (Element.SliceCount == 0) return; if (!Element.IsChanged && !ConfigChanged && !XPathNamePin.IsChanged) { return; } Elements.SliceCount = Element.SliceCount; for (int i = 0; i < Element.SliceCount; i++) { try { var element = Element[i]; if (!string.IsNullOrEmpty(XPathNamePin[0]) && element != null) { Elements[i] = element.XPathSelectElements(XPathNamePin[0], NamespaceResolver[0]).ToSpread(); } else { Elements[i] = new Spread <XElement>(0); } } catch (Exception e) { Elements[i] = new Spread <XElement>(0); FLogger.Log(e); } } var allElements = Elements.SelectMany(spread => spread).ToArray(); // set slicecount to all element hits ElementsName.SliceCount = allElements.Length; #region process names int j = 0; foreach (var element in allElements) { ElementsName[j] = element.Name.ToString(); j++; } #endregion process names #region process queries foreach (var query in FQueries.Values) { var queryExistsPin = query.QueryExistsContainer.IOObject; var queryPin = query.QueryContainer.IOObject; var firstPin = query.FirstContainer.IOObject; var allPin = query.AllContainer.IOObject; queryExistsPin.Length = allElements.Length; queryPin.Length = allElements.Length; firstPin.Length = allElements.Length; allPin.Length = allElements.Length; using (var queryExistsWriter = queryExistsPin.GetWriter()) using (var queryWriter = queryPin.GetWriter()) using (var firstWriter = firstPin.GetWriter()) using (var allWriter = allPin.GetWriter()) { foreach (var element in allElements) { XObject xobj = null; IEnumerable <XObject> xobjEnumerable = null; try { var node = (IEnumerable)element.XPathEvaluate(query.Name, NamespaceResolver[0]); xobjEnumerable = node.Cast <XObject>(); xobj = xobjEnumerable.FirstOrDefault(); } catch (XPathException xe) { FLogger.Log(xe); } if (xobj != null) { if (xobj.NodeType == XmlNodeType.Attribute) { var attr = xobj as XAttribute; queryExistsWriter.Write(true); queryWriter.Write(attr.Value); firstWriter.Write(new XElement("NIL")); allWriter.Write(new MemoryIOStream <XElement>(0)); } else { var el = xobj as XElement; queryExistsWriter.Write(true); queryWriter.Write(el.Value); firstWriter.Write(el); allWriter.Write(xobjEnumerable.Cast <XElement>().ToStream()); } } else { queryWriter.Write(""); queryExistsWriter.Write(false); firstWriter.Write(new XElement("NIL")); allWriter.Write(new MemoryIOStream <XElement>(0)); } } } } #endregion process queries ConfigChanged = false; }