Hace poco tuve que manipular los resultados de una consulta FOR XML de SQL server. La query que me venía de base de datos contenía un campo con una sub-select que se imprimía en un string xml.
Dependiendo de unas restricciones de seguridad, para ciertos registros se tenían que eliminar algunos de los nodos del XML. Eso me obligaba a trasladar lógica de negocio a base de datos o bien tratar de aprovechar la potencia del framework .NET y Linq to XML.
Imaginemos que tenemos un string XML con los datos de contactos de clientes y que, en función de los permisos del usuario, no se permite mostrar el teléfono o la dirección de correo electrónico, por ejemplo. El campo XML que nos devolvería la base de datos para un cliente tendría una estructura de este tipo:
<Contacts>
<Contact>
<ContactId>1</ContactId>
<Name>Jose</Name>
<Surname>Perez</Surname>
<Email>pepe@email.com</Email>
<Phone>93 111 22 33</Phone>
<Mobile>600 11 22 33</Mobile>
</Contact>
<Contact>
<ContactId>1</ContactId>
<Name>Alberto</Name>
<Surname>Garcia</Surname>
<Email>berto@email.com</Email>
<Phone>93 333 22 11</Phone>
<Mobile>600 33 22 11</Mobile>
</Contact>
</Contacts>Para tratar el XML, es conveniente crear un método que reciba por parámetro la información de los datos de contacto de los clientes en un string con formato XML y un enumerado con los permisos del usuario que desea consultar los datos.
private static string ClearXmlInfo(string xmlInfo, IEnumerable permissions)
{
string resultXML = string.Empty;
if (string.IsNullOrWhiteSpace(xmlInfo))
return;
XElement xElement = XElement.Parse(xmlInfo);
var contacts = (from c in xElement.Descendants("Contact")
select c);
foreach(contact in contacts)
{
if(!permissions.Contains(Permission.ShowEmail))
xElement.SetElementValue("Email", string.Empty);
if(!permissions.Contains(Permission.ShowPhone))
xElement.SetElementValue("Phone", string.Empty);
if(!permissions.Contains(Permission.ShowMobileNumber))
xElement.SetElementValue("Mobile", string.Empty);
resultXML += xElement;
};
return resultXML;
}Conclusiones
El ejemplo es sencillo, pero espero que sirva para ilustrar que es bastante fácil recorrer y manipular XML con el framework de .NET y Linq.



