【问题标题】:process xmlnodeslist programatically in c# instead of XAML在 C# 中而不是 XAML 中以编程方式处理 xmlnodelist
【发布时间】:2014-01-06 05:50:32
【问题描述】:

上下文:XAML、WPF、C#。

有一些 XML 数据。 (见下文)。

有一个 ListBox 应该显示节点的 subNodes 的 InnerText (因为还有其他与节点相同级别的子节点)

我通过 news="getTagsbyname("item"); 获得了 XmlNodesList;

我已将 Listbox 的 ItemsSource 设置为 news

但我只想显示标题,而不是里面的所有数据

所以我尝试了 DisplayMemberPath="title";

不幸的是,这不起作用,因为没有“news.title”属性。相反,所需的数据位于 news.ChildNodes[0].InnerText

所以我尝试了 DisplayMemberPath = "ChildNodes[0].InnerText"。显然,这也不起作用。

XmlDocument rss = new XmlDocument();
rss.Load("c:\rss.xml");
XmlElement rc = rss.DocumentElement;
XmlNodeList news = rc.GetElementsByTagName("item");
listbox1.ItemsSource = news;
listbox1.DisplayMemberPath = "ChildNodes[0].InnerText";

因为我不知道如何解决这个问题,所以我切换到 XAML 并使用 XmlDataProvider、DataTemplate 和 Xpath 解决了这个问题:

<XmlDataProvider x:Key="titles"   Source="C:\rss.xml"  XPath="/rss/channel/item" />
 <ListBox Name="listbox1" SelectionChanged="listbox1_SelectionChanged" ItemsSource="        {Binding Source={StaticResource titles}}" >
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding XPath=title}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

我的问题是:

如何在 C# 中而不是在 XAML 中完成同样的事情?

因为我希望在文本框(由用户)中指定 rss 链接,例如 rss.Load (textBox1.Text),而不是先在本地保存 .xml 文件。

我的问题是“新闻”是一个列表,数据不是属性或属性,而是成员的属性,即 news.ChildNodes[0].InnerText。以及访问它的语法 - 我不知道如何在 ItemsSource 或 DisplayMemberPath 的字符串中传递它。

我希望我清楚而具体地描述了我的问题。

提前感谢您的宝贵建议。

这是 XML 模型。

<rss>
<channel>
<author>
<title>qwer</title>
<image/>
<link>www</link>
</author>
<item>
<title>header1</title>
<description>abcd</description>
<category>1</category>
</item>
<item>
<title>header2</title>
<description>efgh</description>
<category>2</category>
</item>
</channel>
</rss>

【问题讨论】:

    标签: c# xml xaml xpath itemssource


    【解决方案1】:

    您可以使用LINQ to XML 完成此操作。我想如果你定义一个这样的类会更好:

    public class RssItem
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public string Category { get; set; }
    }
    

    并阅读您的 Xml 文件:

    XDocument xDoc = XDocument.Load(@"c:\rss.xml");
    
    var items = (from x in xDoc.Descendants("item")
                    select new RssItem
                    {
                       Title = (string) x.Element("title"),
                       Description = (string) x.Element("description"),
                       Category = (string) x.Element("category")
                    }).ToList();
    

    然后填充您的 listView(使用 listView 而不是 listBox)

    foreach (var rssItem in items)
    {
         ListViewItem item  = new ListViewItem();
         item.Text = rssItem.Title;
         item.Tag = rssItem;
         listView1.Items.Add(item);
     }
    

    在这里,我们将您的 rssItem 存储到项目的 Tag 属性中。因此,如果您需要访问该项目,您可以使用 SelectedItem.Tag 属性。

    【讨论】:

    • 在发布问题之前,我在这里和其他地方进行了很多搜索。大多数关于 xml 和数据绑定的问题的答案是:“你可以用 LINQ 来做”。抱歉,我忘了提:我不想用 LINQ 来做。我不想使用另一种方法获得快速解决方案。我只想了解如何以经典方式进行操作。另外,我已经阅读了您的答案并且我已经理解了。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多