2015-11-02 65 views
-3

所以我想填充一个Xml文档到一个对象的列表中,我设法检索单个节点,但问题是我想选择几个!C#Xml Linq,填充某些对象类型的列表

这里是对象

public class Item 
{ 
    public string Title{get;set;} 
    public string Date{get;set;} 
} 

这里是XML

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfFeed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <XmlItem Name="Test"> 
    <Items> 
     <SubItem> 
     <Title>Some Title</Title> 
     <Date>Fri, 30 Oct</Date> 
     </SubItem> 
     <SubItem> 
     <Title>Some Title</Title> 
     <Date>Fri, 30 Oct</Date> 
     </SubItem> 
    </items> 
    </XmlItem> 
</ArrayOfFeed> 

这里是我的代码。正如我之前所说的,我设法只选择XML中的第一个子项,我想选择全部。试图玩弄它,但迄今没有成功。

var itemToFind = "Test" 
XDocument doc = XDocument.Load(location); 
IEnumerable<Item> result = (from c in doc.Descendants("XmlItem") 
           where c.Attribute("Name").Value == itemToFind 
           let r = c.Element("Items") 
           let z = r.Element("SubItem") 

           select new Item() 
           { 
            Title = (string)z.Element("Title"), 
            Date = (string)z.Element("Date"), 
           }).ToList(); 

return result; 

帮助真的会感谢:)

+1

那么你的当前代码会发生什么?你为什么要创建FeedItem类型的对象而不是Item?你为什么要分配属性标题和日期而不是标题和日期?你为什么要在最后调用'Cast ().ToList()'?你真的在寻找SubItems而不是XmlItems吗? (您的Item类只有一个标题/日期,表明它属于SubItem而不是XmlItem ...) –

+0

在您的XML中是否有超过一个具有属性Name =“Test”的XmlItem元素? –

+0

对不起,我不得不重写我的代码,以便更容易理解我想要的内容,因此,现在应该纠正一些错别字。 关于我在最后的演员,我只是把它扔在那里,因为它给了我例外。 进出口寻找所有子项的值,比如标题和日期,我要找回所有的人都在那里/如果XmlElements属性匹配, 对不起,希望它更有意义:) – user3122978

回答

0

我更熟悉XmlDocuments比XDocuments,但这里是我会怎么做:

  • 加载XML到XmlDocument( doc)
  • 使用SelectNodes方法获取节点集合,参数为XPath添加到您希望在集合中的节点 - 我假设您想要查找所有XmlItem具有Name =“Test”属性的节点。
  • 的foreach XmlNode该集合中(一个XmlNodeListSelectNodes返回),你将需要使用SelectNodes得到这个第二集合中的所有SubItems节点
  • 环路(中SubItems),并创建新的项目,并使用的SelectSingleNode方法来获取标题和日期值。
0

试试这个。项目的结束标记需要大写I.我使用ParseExact将日期字符串转换为DateTime。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 


namespace ConsoleApplication1 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      string xml = 
       "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
        "<ArrayOfFeed xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + 
         "<XmlItem Name=\"Test\">" + 
         "<Items>" + 
          "<SubItem>" + 
          "<Title>Some Title</Title>" + 
          "<Date>Fri, 30 Oct</Date>" + 
          "</SubItem>" + 
          "<SubItem>" + 
          "<Title>Some Title</Title>" + 
          "<Date>Fri, 30 Oct</Date>" + 
          "</SubItem>" + 
         "</Items>" + 
         "</XmlItem>" + 
        "</ArrayOfFeed>"; 
      XDocument doc = XDocument.Parse(xml); 
      string itemToFind = "Test"; 

      List<Item> items = doc.Descendants("XmlItem").Where(x => x.Attribute("Name").Value == itemToFind).Descendants("SubItem").Select(y => new Item 
      { 
       Title = y.Element("Title").Value, 
       Date = DateTime.ParseExact(y.Element("Date").Value, "ddd, dd MMM", System.Globalization.CultureInfo.InvariantCulture) 
      }).ToList(); 

     } 
    } 
    public class Item 
    { 
     public string Title { get; set; } 
     public DateTime Date { get; set; } 
    } 


} 
​ 
+0

您错过了'itemToFind'过滤器。 –

+0

修改了代码。 – jdweng