2011-01-04 2 views
6

Qualcuno ha un modo pulito di trovare o creare un XObject usando un'espressione XPath.trovare o creare un elemento da XPath utilizzando LINQ to XML

Il problema che sto avendo è che ho bisogno di impostare un valore su un elemento (che ho l'xpath per), che può o non essere in atto. Se non esiste, vorrei che fosse creato.

Eventuali suggerimenti o link sarebbe molto apprezzato.

Grazie a tutti.

+1

XPath seleziona nodi, non serializzare nuovi documenti né valore aggiornamento nodi. Oltre a ciò, questa domanda non è ben definita: come @C. Lawrence Wenham ha sottolineato quando '// element' viene valutato su un set di nodi vuoto, dove pensi che l'elemento debba essere creato? –

+0

@ Alejandro. La domanda potrebbe essere formulata meglio. Concordato. Sto cercando una funzionalità simile a quella fornita da JXPath nel mondo Java. Vedi http://commons.apache.org/jxpath/users-guide.html#Creating_Objects. Usando questa API è molto possibile definire il nodo da aggiornare o creare tramite xpath. In questa API è comune a "combinare creando un percorso con l'impostazione del valore della foglia. Il metodo createPathAndSetValue (percorso, valore) viene utilizzato per questo" – mileyd

risposta

1

È possibile utilizzare la classe System.Xml.XPath.Extensions per valutare le espressioni XPath su un XDocument.

http://msdn.microsoft.com/en-us/library/system.xml.xpath.extensions.aspx

Ad esempio:

using System.Xml.XPath; 
... 
XDocument doc = XDocument.Load("sample.xml"); 
var matching = doc.XPathEvaluate("//Book[@Title='Great Expectations']"); 
// 'matching' could be an IEnumerable of XElements, depending on the query 
+0

Grazie per la pronta risposta ragazzi, ma quello che sto cercando è la possibilità di creare un nodo basato su xpath dove non lo fa. Così, ad esempio, potrei fare qualcosa del tipo: var matching = doc.XPathSelectElement ("// Book [@ Title = 'Great Expectations']"); e nel caso in cui l'elemento non esiste la cosa viene creata per me. – mileyd

+2

Non credo che può essere fatto, in .Net o, in generale, dal momento che XPath è un linguaggio di query non si può dedurre quale singola catena di nodi deve essere fatto per soddisfare la sua condizione, perché ci potrebbero essere infinite gerarchie validi . Nell'esempio, "// Book" significa "un elemento Book in qualsiasi punto del documento", quindi se dovessi creare il nodo allora dove lo inseriresti? –

+0

Punto preso @ C. Lawrence Wenham. Ero un po 'pigro lì, usando il tuo esempio come riferimento. Dove è possibile dedurre una singola catena di nodi (vedi il mio esempio nella mia risposta a @Alejandro), in questo caso, nel mondo Java posso usare l'API JXPath comune per fare ciò. Questo è quello che sto cercando di replicare con .NET. – mileyd