2011-01-04 12 views
6

¿Alguien tiene una manera clara de encontrar o crear un XObject utilizando una expresión xpath?Buscar o crear un elemento mediante xpath utilizando LINQ-to-XML

El problema que estoy teniendo es que necesito establecer un valor en un elemento (para el cual tengo el xpath), que puede existir o no. Si no existe, me gustaría que se cree.

Cualquier sugerencia o enlace sería muy apreciado.

Gracias a todos.

+1

XPath selecciona nodos, que no serializa los nuevos documentos ni el valor de actualización de nodos. Además de eso, esta pregunta está mal definida: como @C. Lawrence Wenham ha señalado que cuando '// element' se evalúa en un conjunto de nodos vacío, ¿dónde cree que se debe crear el elemento? –

+0

@Alejandro. La pregunta podría ser mejor redactada. Convenido. Estoy buscando una funcionalidad similar a la proporcionada por JXPath en el mundo de Java. Ver http://commons.apache.org/jxpath/users-guide.html#Creating_Objects. Usando esta API es muy posible definir el nodo que se actualizará o creará a través de xpath. En esta API es común "combinar la creación de una ruta con la configuración del valor de la hoja: el método createPathAndSetValue (ruta, valor) se utiliza para eso". – mileyd

Respuesta

1

Puede usar la clase System.Xml.XPath.Extensions para evaluar expresiones XPath en un XDocument.

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

Por ejemplo:

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

Gracias por la pronta respuesta chicos, pero lo que estoy buscando es la capacidad de crear un nodo basado en xpath donde no lo hace. Entonces, por ejemplo, podría hacer algo como: var matching = doc.XPathSelectElement ("// Book [@ Title = 'Great Expectations']"); y en caso de que el elemento no exista, la cosa se crea para mí. – mileyd

+2

No creo que se pueda hacer, en .Net o en general, dado que XPath es un lenguaje de consulta, no se puede deducir qué cadena única de nodos se debe hacer para satisfacer su condición, porque podría haber infinitas jerarquías válidas . En el ejemplo, "// Libro" significa "un elemento Libro en cualquier parte del documento", por lo que si creara el nodo, ¿dónde lo colocaría? –

+0

Punto tomado @C. Lawrence Wenham. Estaba siendo un poco vago allí, solo usando tu ejemplo como referencia. Donde se puede deducir una sola cadena de nodos (ver mi ejemplo en mi respuesta a @Alejandro), en este caso, en el mundo Java puedo usar la API JXPath de commons para hacer esto. Eso es lo que estoy tratando de replicar con .NET. – mileyd

Cuestiones relacionadas