Ciao a tutti,
come ci suggerisce il titolo del post, oggi illustrerò un modo comodo per leggere un file ( oppure una stringa ) contenente un messaggio XML per utilizzarlo all'interno del nostro programma......
Innanzitutto, prendiamo un file XML
<XML_NUMORDINE>
<INFORMAZIONI>
<CODICE_PREVENTIVO>2016O000000470</CODICE_PREVENTIVO>
<DATA_AUTORIZZAZIONE>2016-12-01</DATA_AUTORIZZAZIONE>
<NUMERO_ORDINE>1</NUMERO_ORDINE>
<DATA_ORDINE>2016-12-01</DATA_ORDINE>
</INFORMAZIONI>
<INFORMAZIONI>
...
</INFORMAZIONI>
<INFORMAZIONI>
...
</INFORMAZIONI>
<INFORMAZIONI>
...
</INFORMAZIONI>
</XML_NUMORDINE>
La necessità è, come si può immaginare, quella di ricreare un vettore o lista contenente tutti i campi racchiusi nel tag <INFORMAZIONI/>.
Per far ciò utilizzeremo Linq, innanzitutto una classe di comodo che rappresenta i dati :
public class ItemsXmlTibcoPull {
public ItemsXmlTibcoPull() {
CODICE_PREVENTIVO = "";
DATA_AUTORIZZAZIONE="";
NUMERO_ORDINE = "";
DATA_ORDINE = "";
}
public string DATA_ORDINE { get; set; }
public string NUMERO_ORDINE { get; set; }
public string DATA_AUTORIZZAZIONE { get; set; }
public string CODICE_PREVENTIVO { get; set; }
}
In seconda battuta un parser:
//" NOTA:questo parser prevede in ingresso il path del file xml o il suo contenuto"
public List<ItemsXmlTibcoPull> parser(String path, bool isPath = true){
List<ItemsXmlTibcoPull> list = new List<ItemsXmlTibcoPull>();
XElement e =null;
if (isPath) e = XElement.Load(path);
else e = XElement.Load(new System.IO.StringReader(path));
//wrappiamo il tag <INFORMAZIONI/>
foreach (XElement level1Element in e.Elements("INFORMAZIONI"))
{
ItemsXmlTibcoPull item = new ItemsXmlTibcoPull();
//e per ogni elemento ne prendiamo il valore
foreach (XElement level2Element in level1Element.Elements("CODICE_PREVENTIVO"))
{
item.CODICE_PREVENTIVO = level2Element.Value;
}
foreach (XElement level2Element in level1Element.Elements("DATA_AUTORIZZAZIONE"))
{
item.DATA_AUTORIZZAZIONE = level2Element.Value;
}
foreach (XElement level2Element in level1Element.Elements("NUMERO_ORDINE"))
{
item.NUMERO_ORDINE = level2Element.Value;
//qualora avessimo dovuto recuperare un attributo sulla property... name ad esempio
//result.AppendLine(level1Element.Attribute("name").Value);
}
//result.AppendLine(level1Element.Attribute("name").Value);
foreach (XElement level2Element in level1Element.Elements("DATA_ORDINE"))
{
item.DATA_ORDINE = level2Element.Value;
}
list.Add(item);
}
return list;
}
ed il gioco è fatto!!!
Non commento ulteriormente perchè si commenta da solo .....
buon lavoro!
ciao