GetElementByTagName returns System.Xml.XmlElementList

本文关键字:XmlElementList Xml System returns GetElementByTagName | 更新日期: 2023-09-27 18:01:33

我有一个XML文档,看起来像这样

<?xml version="1.0" encoding="utf-8" ?>
<event>
  <name>Test Event</name>
  <date>07/09/1997</date>
  <description>Birthday</description>
  <blogURL></blogURL>
</event>

我想抓取这些字段并显示在ASP:Labels

这是我在 后面的代码
    protected void Page_Load(object sender, EventArgs e)
    {
        XmlDocument pressRelease = new XmlDocument();
        pressRelease.Load(Server.MapPath("~/PressSection.xml"));
        XmlNodeList name = pressRelease.GetElementsByTagName("name");
        CurrentEventName.Text = name.ToString();
    }

但这是标签

中显示的内容
System.Xml.XmlElementList

不太确定我做错了什么。

GetElementByTagName returns System.Xml.XmlElementList

顾名思义,正如文档所告诉您的,该方法返回:

包含所有匹配节点列表的XmlNodeList。如果没有匹配name的节点,返回的集合将为空。

你需要迭代这个列表,或者如果你确定一个元素总是在那里,就直接取第一个元素:

var names = pressRelease.GetElementsByTagName("name");
CurrentEventName.Text = names[0].Value;

也就是说,LINQ to XML是一个更好的API,我绝对鼓励你更多地了解它:

var doc = XDocument.Load(Server.MapPath("~/PressSection.xml"));
CurrentEventName.Text = (string)doc.Descendants("name").Single();

试试这个

XDocument doc = XDocument.Load(Server.MapPath("~/PressSection.xml"));
var query = doc.Descendants("event").Elements("name").FirstOrDefault();
Console.WriteLine(query.Value);

这实际上是预期的行为。

这样做的原因是它返回符合您的条件的所有元素的列表。如果您确定总是需要第一个元素,则可以通过以下方式获取第一个元素:

name[0].ToString()

然而,您可能还想为XmlElementList添加一些空和空检查,因为它也可能是空的,这将导致您获得一个空指针异常,如果您试图从中获取一个项目。