2010-11-20 6 views
1

Y at-il un moyen de prendre une feuille de calcul et de le transformer en fichier xml ci-dessous?comment puis-je transformer un ensemble de lignes CSV en XML?

<?xml version="1.0"?> 
<ArrayOfBusiness xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Business> 
    <Name>Company Name 1</Name> 
    <AddressList> 
     <Address> 
     <AddressLine>123 Main St.</AddressLine> 
     </Address> 
    </AddressList> 
    </Business> 
    <Business> 
    <Name>Company Name 2</Name> 
    <AddressList> 
     <Address> 
     <AddressLine>1 Elm St.</AddressLine> 
     </Address> 
     <Address> 
     <AddressLine>2 Elm St.</AddressLine> 
     </Address> 
    </AddressList> 
    </Business> 
</ArrayOfBusiness> 
+0

Utilisez feuille de style XSLT. – khachik

+0

Bien sûr qu'il n'y en a pas. CSV est une virgule séparée, tandis que XML est hiérarchique. Il n'y a pas de correspondance 1 à 1 possible. Vous aurez besoin de quelque chose pour effectuer la conversion et ce quelque chose doit comprendre les deux formats, alors ne vous attendez pas à des miracles. –

+0

2nded for xslt, ces données semblent assez plates. Mais xslt est une peine à travailler avec, personnellement j'utiliserais linqpad et jetterais ceci à une chaîne. – jcollum

Répondre

2

Je mets cela dans LinqPad et il a fait ce que vous avez besoin. Si vous n'avez jamais utilisé LinqPad ... eh bien, c'est le bon moment pour commencer.

var csvs = new List<string>(); 

csvs.Add("Company Name 1,123 Main St."); 
csvs.Add("Company Name 2,1 Elm St.,2 Elm St."); 

var xml = 
(from c in csvs 
let split = c.Split(',') 
select // split 
new XElement("ArrayOfBusiness", 
    new XElement("Business", 
     new XElement("Name", split[0]), 
     new XElement("AddressList", 
      new XElement("Address" 
      , 
      (from s in split.Skip(1) // skip the first split 
      select 
      new XElement("AddressLine", s)) 
     ) 
)))); // <-- is it LISP? 

xml.Dump(); 

Résultats:

<ArrayOfBusiness> 
    <Business> 
    <Name>Company Name 1</Name> 
    <AddressList> 
     <Address> 
     <AddressLine>123 Main St.</AddressLine> 
     </Address> 
    </AddressList> 
    </Business> 
    <Business> 
    <Name>Company Name 2</Name> 
    <AddressList> 
     <Address> 
     <AddressLine>1 Elm St.</AddressLine> 
     <AddressLine>2 Elm St.</AddressLine> 
     </Address> 
    </AddressList> 
    </Business> 
</ArrayOfBusiness> 

Il est pas exactement ce que vous vouliez, mais il semble fonctionnellement équivalent à moi. Peut-être besoin d'un peu de peaufinage dans le LINQ.

écrire dans le fichier avec: File.WriteAllText(@"c:\temp\addresses.xml", xml.ToString());

+0

Il y a place pour la gestion des erreurs ici, que se passe-t-il si la liste d'adresses est vide, etc. – jcollum

+0

Cela fonctionnera-t-il dans l'autre sens? Je veux produire le fichier XML à partir d'un fichier de feuille de calcul/csv. – Rod

+0

Bah! Modification maintenant Je dois lire de plus près. – jcollum

0

L'analyse du fichier .csv en objets 'Business' devrait être simple.

C'est alors un cas simple d'utiliser la classe XmlSerializer pour générer le fichier XML.

+0

Et à quoi ressemblera cet objet métier? CSV est plat. XML est hiérarchique. Pas de cartographie 1 à 1 possible à moins bien sûr que vous le codiez en dur quelque part. –

+0

Je ne suis pas sûr de savoir ce que vous voulez dire. Si les données sont stockées au format csv, les données sont à plat. Par conséquent, le fait que xml soit hiérarchique n'est pas pertinent car il peut toujours stocker des données à plat. – haymansfield

0

Je dirais que oui, mais sans voir le fichier CSV, c'est difficile à dire.

Si votre CSV était somthing comme ceci:

Nom, Adresse1, Address2

Nom de l'entreprise 1123, rue Main,

Nom de la société 2,1 Elm St., 1 Elm St

vous pourriez facilement analyser ceci dans une classe.

class Business 
{ 
    public string Name { get; set; } 
    public List<Address> AddressList { get; set; } 
} 

class Address 
{ 
    public string AddressLine { get; set; } 
} 

(non testé)