/// <summary> /// Recupera i valori trovati per l'xpath specificato utilizzando XPathNavigator /// </summary> /// <typeparam name="TType">Tipo di ritorno, effettua il cast utilizzando GetValue-TTYpe</typeparam> /// <param name="nav">XPathNavigator da valutare</param> /// <param name="xPath">query xpath</param> /// <param name="stopAtFirstResult">si ferma al primo riscontro (interrompe il ciclo)</param> /// <returns>il valore recuperato</returns> public static IEnumerable <TType> GetValuesFromXPath <TType>(this XPathNavigator nav, string xPath, bool stopAtFirstResult = false) { var expr = nav.GenerateExpression(xPath); if (expr.ReturnType == XPathResultType.Boolean) { var eval = nav.Evaluate(expr); return(new[] { eval.GetValue <TType>() }); } var navigators = nav.SelectFromXPath(expr, stopAtFirstResult); return(navigators .Select(currentNavigator => (String.IsNullOrEmpty(currentNavigator.InnerXml) ? currentNavigator.OuterXml : currentNavigator.InnerXml) .GetValue <TType>()) .ToList()); }
/// <summary> /// Aggiorna il un campo xml con il valore specificato per l'elemento radice /// </summary> /// <param name="navigator">Elemento da modificare</param> /// <param name="xPath">XPath da valutare per il SetValue</param> /// <param name="value">Valore da aggiornare</param> public static void Update(this XPathNavigator navigator, string xPath, string value) { if (navigator == null) { throw new ArgumentNullException(nameof(navigator)); } if (string.IsNullOrEmpty(xPath)) { throw new ArgumentNullException(nameof(xPath)); } var elementToUpdate = navigator .SelectFromXPath(navigator.GenerateExpression(xPath), stopAtFirstResult: true, forUpdate: true) .FirstOrDefault(); if (elementToUpdate == null) { throw new ArgumentException("Non esiste nessun nodo per l'xpath specificato", "xPath"); } elementToUpdate.SetValue(value); }