我的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>();
是否可以使用Linq和Xpath将所有寄生节点添加到Document.DocParas List<string>
中,还是应该以不同的方式执行此任务?
注意:我正在使用.NET C#3.5
答案 0 :(得分:1)
你可以像这样使用smth:
DocParas = doc.XPathSelectElements("paras/para/paratext").Select(xElement => xElement.Value).ToList();
XPathSelectElements
名称空间中未声明System.Xml.XPath
。
答案 1 :(得分:1)
在这种情况下我会使用XML序列化。由于您将所有文档(或至少其中很大一部分)解析为模型,并且您的代码开始与XML中的级别一起使用,我认为让序列化框架执行它的工作更简单。
答案 2 :(得分:0)
获得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();
所以在你的代码中我认为它变成了:
...//
...//
DocParas = doc.Descendants().Where(x => x.Parent.Name == "paras" && x.Name == "para").Select(x => x.Value).ToList()
}