Ceci me rend fou de chauve-souris! fichier de données client:Linq pour joindre des tables sur XElement.Name = XAttribute ("n")
<rows>
<row>
<CustomerID>ABC123</CustomerID>
<PrdcrCd>10</PrdcrCd>
<StrAdr>123 Main St., NW</StrAdr>
<City>Anytown</City>
etc.
</row>
<rows>
fichier de la carte pour transformer les données client en entrée acceptable:
<SourceEntries>
<map>
<Field n='CustomerID' m='201' />
<Field n='StrAdr' m='315' />
<Field n='City' m='316' />
<Field n='PrdrCd' m='442' />
etc.
</map>
</SourceEntries>
Enfin, le modèle pour l'entrée acceptable:
<template>
<Field n='ClientId' id='201' />
<Field n='Street Address' id='315' />
<Field n='City' id='316' />
<Field n='ProducerCode' id='442' />
etc.
</template>
Ainsi, à partir du fichier client Nom XElement, correspond à la valeur de l'attribut Source Entries 'n' et obtient la référence de la carte Entires source m. Ensuite, utilisez m pour faire correspondre un attribut d'élément de gabarit i, récupérez l'attribut de nom de gabarit 'n' et créez une nouvelle arborescence XElement en utilisant ce nom.
Depuis que je suis un noob chez Linq, et pas particulièrement expert en XML, je pensais que je commencerais lentement. Comme ceci:
var results = from t1 in clientXm.Elements("row").Descendants()
join t2 in sourceEntries.Elements("Field") on t1.Name equals t2.Attributes("n") into xRef
select new
{
(string)xRef.Attributes("n"),
(string)xRef.Attributes("m")
};
erreur d'abord, dans la jointure clause « sur t1.Name.LocalName est égal à » est ce type d'argument « string » est pas cessibles au paramètre type « TKey ». Ensuite, dans la clause select, pour les deux éléments qui m'intéressent, j'obtiens que "l'initialisation de projection de type anonyme doit être un nom simple ou une expression d'accès de membre". Oh, et bien sûr, les structures de fichiers XML sont des spécifications, donc je ne peux en changer aucune. À ce stade, je suis tellement confus Je ne sais pas si le monde est à l'envers, ou je suis debout sur ma tête. Puis-je acheter une idée ... ou au moins une voyelle? Tout le monde aide grandement apprécié.
EDIT
En utilisant LINQPad, j'ai essayé cette déclaration:
XElement _clientXml = XElement.Load(@"client.xml");
XElement _sourceEntries = XElement.Load(@"Client_Map.xml");
foreach (XElement clientData in _clientXml.Descendants("row").Descendants()){
IEnumerable<XElement> mapRefs =
from mapData in _sourceEntries.Descendants("Field")
where clientData.Name.LocalName == (string) mapData.Attribute("n")
select mapData;
foreach (XElement item in mapRefs){
Console.WriteLine(item.Attribute("m"));
}
}
Dans LINQPad, ce produit une liste de valeurs "m" - juste ce que je suis en train de faire à ce un pas de bébé. MAIS le même code exact dans VS ne me donne rien. Quand je débogue, mapRefs est un ensemble vide quand j'arrive au second foreach.
Cela a-t-il un sens?
Merci Randy
Désolé, ne réalisais pas à quel niveau beaucoup ma frustration montrait à travers. .. S'il vous plaît pardonner. – EoRaptor013