posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Query Linq apparentemente errate in OOXML

Le query con Linq to XML sono tra le meraviglie di un developer managed. Infinitamente più semplici di DOM/SAX/XmlReader e con prestazioni da urlo.

Il team di Office ha disegnato un Object Model che mappa 1:1 il formato XML del nuovo formato ISO "Office Open XML". Da una parte questo approccio è poco conveniente perché è possibile generare documenti non well-formed, dall'altra offre vantaggi indiscutibili come quello di "Document Reflector" il tool dell'sdk che genera codice C# a partire da un documento docx/xlsx/pptx o ancora la possibilità di fare query Linq su questo object model come fosse quello di XDocument/XElement.

Ed è proprio da una query su questo object model che è nato un problema di una query apparentemente errata.

La query:

var fldchars = from e in doc.Descendants<FieldChar>() select e;

è equivalente a:

var fldchars = from e in doc.Descendants() where e is FieldChar select e;

ed ha lo scopo di trovare tutti i FieldChar (i field di un documento Word) nel documento a prescindere dal livello della gerarchia xml.

Eseguendo questa query su uno specifico documento usando Linq2XML ottenevo un risultato mentre sul sdk 2.0 di OOXML ritornava un elemento di meno.

Non ci sono bug. Se partiamo a credere subito nei bug prima di fare indagini, è meglio cambiare mestiere, punto.
L'indagine per capire cosa succede deve andare (come sempre) per passi. Quindi la prima cosa che ho fatto è di eseguire la query su tutto il documento:

var fldchars = from e in doc.Descendants() select e;

Query che restituisce tutti gli elementi del documento in modo 'flat' cioè senza più gerarchia xml.

Poi si sbircia nel debugger di Visual Studio per vedere la lista degli elementi e scopriamo che ….

image
L'elemento che mi aspettavo di trovare come FieldChar è stato 'mappato' da XML a OpenXmlUnknownElement che non è di tipo FieldChar e di conseguenza la query non forniva i risultati voluti.

Il file infatti l'ho modificato a mano per creare un test ad-hoc su una situazione molto particolare e perciò il test era sbagliato mentre il codice era giusto (chi testa i test? … va bene questa è un'altra storia).

Lesson learned, e spero che serva anche a qualcun'altro …

Print | posted on martedì 17 agosto 2010 02:30 |

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET