2010-03-16 4 views
1

У меня есть структура XML, которая имеет множество узлов doc, и каждый узел может иметь нулевые или более фрагменты выделения (paras).populating object collection property with 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> 

Я также имею некоторый Linq код, чтобы заполнить некоторые объекты документа:

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>(); 

Есть ли возможность добавить все пункты узлов в Document.DocParas List<string> с помощью Linq и Xpath, или я должен сделать это задача по-другому?

Примечание: Я использую .NET C# 3.5

ответ

1

Вы могли бы использовать, как это л:

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

Не то, что XPathSelectElements объявлен в System.Xml.XPath пространстве имен.

1

В этом случае я бы использовал XML-сериализацию. Поскольку ваш синтаксический анализ всего вашего документа (или, по крайней мере, его большой части) модели, и ваш код начинает бороться с уровнями в XML, я думаю, что проще, чтобы структура сериализации делала это Job.

0

Один из способов получить пункт-х:

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(); 

так в вашем коде, я думаю, что это будет:

...// 
...// 

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

            }