Tenho o seguinte XML:
[code]<?xml version="1.0" encoding="iso-8859-1"?>
<tb_parceiro desc=“Parceiro de negócios”>
<coluna desc="Código do PN">CardCode</coluna>
<coluna desc="Nome do PN">CardName</coluna>
</tb_parceiro>
<tb_teste>
Teste
</tb_teste>
[/code]
- Dentro da tag tabelas ficara todas as minhas tabelas que irei mapear manualmente.
- Dentro de tabelas irá existir uma tag com o nome da tabela e sua descrição. EX: <tb_parceiro desc=“Parceiro de negócios”>
- Dentro de da tb_parceiro irá existir várias tags com o nome com uma descrição e seu valor.
Como percorro esse xml pegando todas as colunas de um determinada tabela, sua descrição e seu valor? E pegar a descrição de uma determinada tabela també?
Tem que ser usando C#.
Ola,
voce pode usar LINQ to XML, por exemplo.
Primeiro eu acho que voce deveria mudar a estrutura do seu XML para ficar mais facil de fazer queries, por exemplo:
<?xml version="1.0" encoding="iso-8859-1"?>
<tabelas>
<tabela name="tb_parceiro" desc="Parceiro de negócios">
<coluna desc="Código do PN">CardCode</coluna>
<coluna desc="Nome do PN">CardName</coluna>
</tabela>
<tabela name="tb_teste">
<coluna desc="teste">Teste</coluna>
</tabela>
</tabelas>
Repare que eu troquei o elementos que vc criou com o nome da tabela e os chamei de “tabela” e adicionei um atributo “name” com o nome da tabela.
E o codigo para percorrer os dados no XML:
XDocument xml = XDocument.Load(c:\\tabelas.xml");
// obtem os nomes das tabelas.
var tabelas = from item in xml.Element("tabelas").Elements("tabela")
select item.FirstAttribute.Value;
foreach (var tab in tabelas)
{
// Faz um loop e obtem as colunas para cada tabela.
Console.WriteLine(String.Format("Tabela -> {0}", tab));
XElement elem = xml.Element("tabelas");
var colunas = elem.Elements("tabela")
.Where( c=> c.FirstAttribute.Value.Equals(tab))
.Descendants();
foreach(var c in colunas)
{
Console.WriteLine(String.Format(" Coluna: {0}", c.Value));
// para pegar a descricao da coluna eh soh fazer:
// c.Attribute("desc");
}
}
O resultado no terminal vai ser assim:
Tabela -> tb_parceiro
Coluna: CardCode
Coluna: CardName
Tabela -> tb_teste
Coluna: Teste
//Daniel
Me emploguei para brincar com o LINQ na hora do almoco, ai vai o codigo completo com algumas modificacoes nas queries. 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
try
{
XDocument doc = XDocument.Load("c:\\tabelas.xml");
var tabelas = GetTableNames(doc);
tabelas.SelectMany(t => new Dictionary<String, IList<XElement>> { {t, GetColumns(doc, t) } })
.ToList()
.ForEach(val => PrintTabInfo(val.Key, val.Value));
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.ReadKey();
}
public static void PrintTabInfo(String tableName , IList<XElement> columns)
{
Console.WriteLine("Table : " + tableName);
foreach (var item in columns)
{
Console.WriteLine("Column : " + item.Value);
}
}
public static IList<String> GetTableNames(XDocument doc)
{
var tabelas = from item in doc.Element("tabelas").Elements("tabela")
select item.FirstAttribute.Value;
return tabelas.ToList();
}
public static IList<XElement> GetColumns(XDocument doc, string tableName)
{
XElement elem = doc.Element("tabelas");
var colunas = elem.Elements("tabela").Where(c => c.FirstAttribute.Value.Equals(tableName))
.Descendants();
return colunas.ToList();
}
}
}
Espero ter ajudado. 
//Daniel
[quote=windsofhell]Me emploguei para brincar com o LINQ na hora do almoco, ai vai o codigo completo com algumas modificacoes nas queries. 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
try
{
XDocument doc = XDocument.Load("c:\\tabelas.xml");
var tabelas = GetTableNames(doc);
tabelas.SelectMany(t => new Dictionary<String, IList<XElement>> { {t, GetColumns(doc, t) } })
.ToList()
.ForEach(val => PrintTabInfo(val.Key, val.Value));
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.ReadKey();
}
public static void PrintTabInfo(String tableName , IList<XElement> columns)
{
Console.WriteLine("Table : " + tableName);
foreach (var item in columns)
{
Console.WriteLine("Column : " + item.Value);
}
}
public static IList<String> GetTableNames(XDocument doc)
{
var tabelas = from item in doc.Element("tabelas").Elements("tabela")
select item.FirstAttribute.Value;
return tabelas.ToList();
}
public static IList<XElement> GetColumns(XDocument doc, string tableName)
{
XElement elem = doc.Element("tabelas");
var colunas = elem.Elements("tabela").Where(c => c.FirstAttribute.Value.Equals(tableName))
.Descendants();
return colunas.ToList();
}
}
}
Espero ter ajudado. 
//Daniel[/quote]
LINQ é uma das coisas mais legais que eu vi no C#. Dá pra fazer códigos muito interessantes, como esse que você fez.