2010-04-23 3 views
2

J'ai un framgment de XML (juste quelques nœuds, pas un document XML complet) dans une chaîne dont j'ai besoin pour extraire des valeurs de Linq vers XML. Je trouve qu'il est assez difficile d'obtenir cette chaîne dans un objet XML avec lequel je peux travailler.Comment charger du XML dans un objet réalisable à partir d'une chaîne de fragment?

Y a-t-il un moyen pour moi de faire cela?

Ceci est un exemple du XML:

<Batch type="My Funds" pageNumber="69"> 
    <FundGroup heading="Best Funds Ever"> 
    <fund id="367"/> 
    <fund id="373"/> 
    <fund id="378"/> 
    </FundGroup> 
    <FundGroup heading="Almost Best Funds"> 
    <fund id="665"/> 
    <fund id="666"/> 
    <fund id="667"/> 
    </FundGroup> 
</Batch> 
+0

Poster la chaîne. En supposant que c'est un format valide, vous devriez être capable de l'analyser directement dans un XDocument. –

Répondre

2

Le fichier XML est intact, donc tout modèle XML devrait fonctionner. XmlSerializer devrait être bien, par exemple; mais que diriez-vous d'un modèle ad-hoc de types anonymes?

 var doc = XElement.Parse(xml); 
     var batch = new { 
      Type = (string)doc.Attribute("type"), 
      Page = (int)doc.Attribute("pageNumber"), 
      Groups = (from fg in doc.Elements("FundGroup") 
         select new { 
          Heading = fg.Attribute("heading"), 
          Funds = (from fund in fg.Elements("fund") 
            select (int)fund.Attribute("id")).ToList() 
         }).ToList() 
     }; 

Explorez batch ;-P

+0

@Mark, c'est au-dessus et au-delà de l'appel du devoir - vous m'a sauvé des heures !! (toujours bien à la fin d'un vendredi :-)) Merci mon pote. Je dois attendre encore quelques minutes avant de le vérifier correctement. – DaveDev

0

Tant que vous avez des nœuds entiers vous pouvez simplement envelopper la chaîne dans une seule balise d'élément et de la charge que.

"<xml>" + myFragment + "</xml >";

1

Vous devriez être en mesure de le faire. S'il y a plusieurs éléments de lot et que vous n'en avez inclus qu'un dans votre extrait, vous devrez envelopper l'extrait entier dans une racine, peut-être <Batches> {xml} </Batches> afin que vous puissiez l'utiliser. Si oui, où je dis

var query = from batch in document.Elements("Batch") ... 

Modifier que pour

... document.Root.Elements("Batch") or document.Descendants("Batch") 

code:

string xml = @"<Batch type=""My Funds"" pageNumber=""69""> 
        <FundGroup heading=""Best Funds Ever""> 
        <fund id=""367""/> 
        <fund id=""373""/> 
        <fund id=""378""/> 
        </FundGroup> 
        <FundGroup heading=""Almost Best Funds""> 
        <fund id=""665""/> 
        <fund id=""666""/> 
        <fund id=""667""/> 
        </FundGroup> 
       </Batch>"; 

XDocument document = XDocument.Parse(xml); 

var query = from batch in document.Elements("Batch") 
      select new 
      { 
       Type = batch.Attribute("type").Value, 
       PageNumber = (int)batch.Attribute("pageNumber"), 
       FundGroups = from fundGroup in batch.Elements("FundGroup") 
           select new 
           { 
            Heading = fundGroup.Attribute("heading").Value, 
            Funds = from fund in fundGroup.Elements("fund") 
              select new { Id = (int)fund.Attribute("id") } 
           } 
      }; 
+0

Excellente réponse, mais Mark a fourni sa réponse en premier, donc j'ai dû donner le chèque. Vous obtenez un +1 si !! Merci Anthony :-) – DaveDev

+0

Content de vous aider, même si c'est un peu plus lent! –

Questions connexes