¿Hay alguna manera de buscar un XDocument sin conocer el espacio de nombres? Tengo un proceso que registra todas las solicitudes SOAP y encripta los datos confidenciales. Quiero encontrar elementos basados en el nombre. Algo así como, dame todos los elementos donde el nombre es CreditCard. No me importa lo que es el espacio de nombres.Buscar XDocument utilizando LINQ sin conocer el espacio de nombres
Mi problema parece ser con LINQ y que requiere un espacio de nombres xml.
Tengo otros procesos que recuperan valores de XML, pero conozco el espacio de nombres para estos otros procesos.
XDocument xDocument = XDocument.Load(@"C:\temp\Packet.xml");
XNamespace xNamespace = "http://CompanyName.AppName.Service.Contracts";
var elements = xDocument.Root
.DescendantsAndSelf()
.Elements()
.Where(d => d.Name == xNamespace + "CreditCardNumber");
que realmente quiere tener la capacidad de buscar XML sin necesidad de conocer los espacios de nombres, algo como esto:
XDocument xDocument = XDocument.Load(@"C:\temp\Packet.xml");
var elements = xDocument.Root
.DescendantsAndSelf()
.Elements()
.Where(d => d.Name == "CreditCardNumber")
Esto no va a funcionar porque no sé de antemano el espacio de nombres en tiempo de compilación.
¿Cómo se puede hacer esto?
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Request xmlns="http://CompanyName.AppName.Service.ContractA">
<Person>
<CreditCardNumber>83838</CreditCardNumber>
<FirstName>Tom</FirstName>
<LastName>Jackson</LastName>
</Person>
<Person>
<CreditCardNumber>789875</CreditCardNumber>
<FirstName>Chris</FirstName>
<LastName>Smith</LastName>
</Person>
...
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Request xmlns="http://CompanyName.AppName.Service.ContractsB">
<Transaction>
<CreditCardNumber>83838</CreditCardNumber>
<TransactionID>64588</FirstName>
</Transaction>
...
Echa un vistazo a esta respuesta de otra pregunta: http://stackoverflow.com/questions/934486/how-do-i-get-a-nametable-f-an-xdocument/3977823#3977823 – MonkeyWrench