Elemento XML de búsqueda con el prefijo de espacio de nombres xml C #

Actualizar

Quiero tener una expresión (XPath o Expresión de expresión regular, similar) que pueda hacer coincidir un elemento XML con un espacio de nombres en particular. Por ejemplo, quiero ubicar el valor del elemento de enlace (por ejemplo, necesito el http://url within http://url) muestra a continuación. Sin embargo, el prefijo del espacio de nombres varía según los diferentes archivos xml, como se muestra en los casos 1-3.

Teniendo en cuenta el carácter permitido para el prefijo de espacio de nombres (por ejemplo, ¿cualquier carácter está permitido / válido), podría alguien proporcionar la solución (XPath, Expresión de expresiones regulares o similar?

Tenga en cuenta que debido a que el archivo xml es desconocido, el espacio de nombres y el prefijo son desconocidos hasta el tiempo de ejecución. Significa que no puedo usar este XDocument / XmlDocument, porque requiere que el espacio de nombres sea conocido en el código.

Actualizar

Caso 1

  http://url   

Caso 2

  http://url   

Caso 3

  http://url   

Tenga en cuenta que la url dentro del elemento de enlace podría ser cualquier url http, y desconocida hasta el tiempo de ejecución.

Actualizar

Por favor marca mi pregunta

Debe conocer los espacios de nombres con los que tratará y registrarlos con un XmlNamespaceManager. Aquí hay un ejemplo:

  XmlDocument doc = new XmlDocument(); doc.LoadXml(""); XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("b", "link"); XmlNodeList books = doc.SelectNodes("//b:Books", nsmgr); 

Y si desea hacerlo utilizando XDocument, que recomendaría por su brevedad, a continuación le indicamos cómo:

  XDocument xDoc = XDocument.Parse(""); XNamespace ns = "link"; var books = xDoc.Descendants(ns + "Books"); 

Si no conoce el (los) espacio (s) de nombres antes de tiempo, vea esta publicación que muestra cómo consultar a través de un XDocument usando solo el nombre local. Aquí hay un ejemplo:

 XDocument xDoc = XDocument.Parse(""); var books = xDoc.Descendants().Where(e => e.Name.LocalName.ToLower() == "books"); 

Utilice un analizador XML, no una expresión regular.

Dicho esto, podrías usar:

 <(?:(.+?):)?Books /> 

Y el espacio de nombres estaría en el grupo capturado 1.

De hecho, te recomiendo más que uses

 <(?:([^<>]+?):)?Books /> 

Para evitar errores, como la coincidencia con otro conjunto de tags XML (¡¿quién usaría <> en un espacio de nombres de todos modos ?!)