【问题标题】:C# XML Linq Pointing to/Reading NodeC# XML Linq 指向/读取节点
【发布时间】:2013-05-10 01:49:13
【问题描述】:

我似乎无法指出并阅读正确的信息。我是使用 Linq 的新手,并且尝试过(在将文档加载为 XDocument 和 XElement 之后)选择、root.xelement、后代、元素、节点等,但没有找到正确的方法来指向我正在尝试的内容目标。 我现在有一个看起来像这样的 XML 文档。

<Contacts>
   <EntryName>
     <Name>NAME1</Name>
     <Email>EMAIL</Email>
     <EIL>1</EIL>
     <Notes>Notes</Notes>
   </EntryName>
</Contacts>

我需要提取所有 EntryNames 的列表并将它们放在 listBox1 中。 当用户选择一个时,它会收集“listBox1.SelectedItem”和 收集关联的电子邮件地址并将其放在文本框中。 运行时的“EntryName”由文本字段替换。 我最近的尝试是这样的:

    var xml = XDocument.Load(apppath + @"\Contacts.clf");
    var entries = xml.Element("Contacts").Value.ToString();

        foreach (var entry in entries)
        {
            listBox1.Items.Add(entry.ToString());
        }

由于 foreach 函数。我正在寻找的是来自联系人的列表框:

EntryName
EntryName2
EntryName2...etc

当被选中时(比如 EntryName2),它会拉出电子邮件字段并将其放在文本框中。请原谅明显或愚蠢的错误,对此非常陌生。谢谢。

【问题讨论】:

    标签: c# linq-to-xml


    【解决方案1】:

    我写了一个关于如何实现这一点的快速示例

    public partial class Form1 : Form
    {
        XDocument doc;
        public Form1()
        {
            InitializeComponent();
    
            doc = XDocument.Load(apppath + @"\Contacts.clf");
            var entryNames = doc.Root.Elements("EntryName")
                .Select(elem => elem.Element("Name").Value ).ToArray();
            listBox1.Items.AddRange(entryNames);
        }
    
        private void listBox1_SelectedValueChanged(object sender, EventArgs e)
        {
            textBox1.Text = doc.Root.Elements("EntryName")
                .FirstOrDefault(node => node.Element("Name").Value == listBox1.SelectedItem.ToString())
                .Element("Email").Value;
    
        }
    }
    

    但是,要找到电子邮件似乎太麻烦了。我会改为这样处理:

    public partial class Form1 : Form
    {
        XDocument doc;
        public Form1()
        {
            InitializeComponent();
            String apppath = ".";
            doc = XDocument.Load(apppath + @"\Contacts.clf");
            var contacts = doc.Root.Elements("EntryName")
                .Select( elem =>
                    new Contact { 
                        Name =  elem.Element("Name").Value,
                        Email = elem.Element("Email").Value,
                        EIL = elem.Element("EIL").Value,
                        Notes = elem.Element("Notes").Value
                }
            ).ToList();
            listBox1.DataSource = contacts;
            listBox1.DisplayMember = "Name";
        }
    
        private void listBox1_SelectedValueChanged(object sender, EventArgs e)
        {
            textBox1.Text = (listBox1.SelectedItem as Contact).Email;
        }        
    }
    
    public class Contact
    {
        public String Name { get; set; }
        public String Email { get; set; }
        public String EIL { get; set; }
        public String Notes { get; set; }
    }
    

    【讨论】:

    • 非常感谢,select 和 from 列表在我的脑海中并不是很清楚,但我习惯于在内部使用数组等处理事情。再次感谢这正是我所需要的。
    【解决方案2】:

    试试这个。我相信您正在尝试查询 XML 文档中的 Name 元素。

    var xml = XDocument.Load(apppath + @"\Contacts.clf");
    var entries = from entryName in xml.Descendants("EntryName") select (string)entryName.Element("Name");
    
    foreach (var entry in entries)
    {
       listBox1.Items.Add(entry);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2019-12-03
      相关资源
      最近更新 更多