заполнение свойства коллекции объектов с помощью Linq - PullRequest
1 голос
/ 16 марта 2010

У меня есть структура XML, которая имеет много doc узлов, и каждый узел может иметь ноль или более извлекаемых абзацев (paras).

<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 для заполнения некоторых объектов 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>();

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

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

Ответы [ 3 ]

1 голос
/ 16 марта 2010

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

1 голос
/ 16 марта 2010

Вы можете использовать что-то вроде этого:

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

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

0 голосов
/ 16 марта 2010

Один из способов получить параграфы:

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

                                    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...