Esaminare documenti XML con namespace utilizzando LINQ to XML

di Andrea Zani, in LINQ, LINQ to XML,

XMl è diventato uno standard di fatto. Da questo formato sono nati mille dialetti per la memorizzazione e rappresentazione di qualsiasi dato. Per identificare in modo univoco i tag all'interno di un documento XML è possibile definire dei namespace. La loro presenza comporta dei problemi nell'utilizzo degli xpath con LINQ to XML. La normale sintassi xpath deve venire modificata e devono essere usate tecniche particolari per la lettura dei documenti.
Prendendo un esempio reale, in Excel è possibile salvare i propri documenti in formato XML. Il documento prodotto ha questa struttura:

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Author>AZ</Author>
  <LastAuthor>AZ</LastAuthor>
  <Created>2008-10-25T18:55:59Z</Created>
  <Company>Home</Company>
  <Version>12.00</Version>
 </DocumentProperties>
...

Nel tag WorkBook sono definiti tutti i namespace utilizzati. Per poter eseguire delle ricerche all'interno di questo documento abbiamo a disposizione varie tecniche, vediamone una con LINQ to XML. Per includere tutti i namespace definiti nell'XML appena visto:

var xmlDoc = XDocument.Load(Path.Combine(
        AppDomain.CurrentDomain.BaseDirectory,
        "test.xls")
        );
XNamespace az= "urn:schemas-microsoft-com:office:spreadsheet";
XNamespace html="http://www.w3.org/TR/REC-html40";
XNamespace o="urn:schemas-microsoft-com:office:office";
XNamespace xsi="http://www.w3.org/2001/XMLSchema-instance";
XNamespace x2="http://schemas.microsoft.com/office/excel/2003/xml";
XNamespace ss="urn:schemas-microsoft-com:office:spreadsheet";
XNamespace x="urn:schemas-microsoft-com:office:excel";

Per eseguire le query con LINQ è sufficiente concatenare i Namespace definiti al nome del tag:

var obj = from s in xmlDoc.Descendants(az + "Workbook")
          select s;

In allegato a questo script, è presente un esempio che legge un documento Excel 2003, salvato in formato XML, e ne visualizza il contenuto.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi