Nel
progetto a qui stò lavorando mi è sorta la necessità di estrapolarmi da un XML
delle mappe di immagini per convertirli in oggetti (HotSpots) da applicare
alla mia ImageMap.
Per aiutarmi in questa operazione mi sono venute in
soccorso le regular expression.
E'la
prima volta che ne applico una, e devo ammettere
che non è stato facile costruirla, ma il risultato ha ricompensato le
fatiche.
Ecco il file xml di partenza
- <productsImage>
- <record>
<image>immagine.gif</image>
<image_path>images/immagine.gif</image_path>
- <product_search_category_map>
- <![CDATA[
<MAP NAME="NAMEABC">
<AREA SHAPE=POLY COORDS="55,150,56,164,65,164,70,158,143,158,149,188,161,189,174,182,167,150,170,145,180,142,187,143,209,131,232,129,248,132,257,137,220,195,221,203,231,206,278,151,275,143,268,131,281,118,247,104,205,103,195,109,191,115,137,126,141,152,68,153,69,146,55,146,55,150" HREF="productsView.asp?product_id=product1" ALT="descrizione 1">
<AREA SHAPE=POLY COORDS="759,159,759,168,749,169,748,164,643,164,643,170,630,181,604,156,619,149,621,144,637,158,744,158,752,154,760,155,759,161,759,159" HREF="productsView.asp?product_id=product2" ALT="descrizione 2">
<AREA SHAPE=CIRCLE COORDS="60,73,16" HREF="productsView.asp?product_id=product3" ALT="descrizione 3">
</MAP>
]]>
</product_search_category_map>
</record>
</productsImage>
E dopo
parecchie prove, ecco la regular expression che mi
convertirà il campo product_search_category_map
<AREA(\s+(?<name>SHAPE|COORDS|ALT|HREF)=("(?<value>[^"]*)"|(?<value>[^\s>]+)))*\s*>
Ma
il
difficile per me, da neofita delle regex, è stato anche l'applicarla e il capire
dove finivano i campi che mi estrapolava, ma alla fine ce l'ho fatta
ed ecco qui il codice di trasformazione da un stringa in input(il campo
product_search_category_map) in un oggetto chiamato Area (con le
proprietà SHAPE, COORDS, ALT e HREF):
public object Transform(string input)
{
List<Area> areas = new List<Area>();
foreach (Match match in Regex.Matches((string)input, @"<AREA(\s+(?<name>SHAPE|COORDS|ALT|HREF)=(""(?<value>[^""]*)""|(?<value>[^\s>]+)))*\s*>"))
areas.Add(CreateArea(match.Groups));
return areas;
}
private Area CreateArea(GroupCollection groupCollection)
{
Area area = new Area();
for (int i = 0; i < groupCollection["name"].Captures.Count; i++)
{
string name = groupCollection["name"].Captures[i].Value;
string value = groupCollection["value"].Captures[i].Value;
switch (name.ToLower())
{
case "shape":
area.Shape = value;
break;
case "coords":
area.Coords = value;
break;
case "alt":
area.Alt = value;
break;
case "href":
area.Href = value;
break;
}
}
return area;
}
Risultato della giornata:
credo che approfondirò la conoscenza delle regular expression e inizierò ad usarle più
spesso. La difficoltà iniziale non è stata poca, ma ci sono strumenti che
ci possono dare una mano, come ad esempio The
Regulator che mi ha permesso di testare a mano a mano la la regular expression durante la sua
creazione.
Print | posted on martedì 23 maggio 2006 18:23