2010-03-16 5 views
1

J'ai une structure XML qui contient plusieurs noeuds doc, et chaque noeud peut contenir zéro ou plusieurs paragraphes d'extraction (paras).Remplissage de la propriété de collection d'objets avec Linq

<doc> 
    <docitem>3</docitem> 
    <docid>129826</docid> 
    <doctitle>sample title</doctitle> 
    <docdatetime>2009-07-03T16:59:00</docdatetime> 
    <collectdatetime>2009-07-03T16:59:23</collectdatetime> 
    <summary> 
     <summarytext>sample summary</summarytext> 
    </summary> 
    <paras> 
     <paraitemcount>2</paraitemcount> 
     <para> 
      <paraitem>1</paraitem> 
      <paratext>sample text 1</paratext> 
     </para> 
     <para> 
      <paraitem>2</paraitem> 
      <paratext>sample text 2</paratext> 
     </para> 
    </paras> 
</doc> 
<doc> 
... 
</doc> 

I a aussi un code Linq pour remplir certains objets Document:

List<Document> documentsList = (from doc in xmlDocument.Descendants("doc") 
           select new Document 
           { 
            DocId = doc.Element("docid").Value, 
            DocTitle = doc.Element("doctitle").Value, 
            DocDateTime = DateTime.Parse(doc.Element("docdate").Value), 
            DocSummary = doc.Element("summary").Value, 
            DocParas = "" ///missing code to populate List<string>         

            } 
           ).ToList<Document>(); 

Est-il possible d'ajouter tous les paragraphes dans les nœuds Document.DocParas List<string> LINQ et XPath, ou dois-je faire cela tâche d'une manière différente?

Note: J'utilise .NET 3.5 C#

Répondre

1

Vous pouvez utiliser smth comme ceci:

DocParas = doc.XPathSelectElements("paras/para/paratext").Select(xElement => xElement.Value).ToList(); 

Non que XPathSelectElements est déclarée dans System.Xml.XPath espace de noms.

1

J'utiliserais la sérialisation XML dans ce cas. Puisque votre analyse de tout votre document (ou au moins une grande partie de celui-ci) à un modèle et votre code commence à se battre avec les niveaux dans le XML, je pense qu'il est plus simple de laisser le framework de sérialisation faire son travail.

0

Une façon d'obtenir de para:

XElement xElement2 = XElement.Parse(@" 
      <doc>  
    <docitem>3</docitem> 
    <docid>129826</docid> 
    <doctitle>sample title</doctitle> 
    <docdatetime>2009-07-03T16:59:00</docdatetime> 
    <collectdatetime>2009-07-03T16:59:23</collectdatetime> 
    <summary> 
     <summarytext>sample summary</summarytext> 
    </summary> 
    <paras> 
     <paraitemcount>2</paraitemcount> 
     <para> 
      <paraitem>1</paraitem> 
      <paratext>sample text 1</paratext> 
     </para> 
     <para> 
      <paraitem>2</paraitem> 
      <paratext>sample text 2</paratext> 
     </para> 
    </paras> 
</doc>"); 

      List<string> docs = xElement2.Descendants().Where(x => x.Parent.Name == "paras" && x.Name == "para").Select(x => x.Value).ToList(); 

donc dans votre code, je pense qu'il devient:

...// 
...// 

DocParas = doc.Descendants().Where(x => x.Parent.Name == "paras" && x.Name == "para").Select(x => x.Value).ToList()         

            } 
Questions connexes