从同名节点获取值

本文关键字:获取 节点 | 更新日期: 2023-09-27 18:13:07

我想从XML文件中检索信息,但是它的格式化方式非常奇怪。

<?xml version="1.0"?>
<Careers>
    <CareerList>
        <CareerName></CareerName>
        <CareerDescription></CareerDescription>
    </CareerList>
    <CareerList>
        <CareerName>Cook</CareerName>
        <CareerDescription>Cooks food for people</CareerDescription>
    </CareerList>
</Careers>

我想获得第二个值,即Cook和描述,即Cooks food for people,但我只获得空节点。例如…

    public string CareerDescription(string CareerFile)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(CareerFile);
        string Description = xmlDoc.SelectSingleNode("Careers/CareerList/CareerDescription").InnerText;
        return Description;
    }

我如何选择第二个节点而不是第一个节点?

从同名节点获取值

可以在XPath表达式中使用索引:

xmlDoc.SelectSingleNode("Careers/CareerList[2]/CareerDescription").InnerText

我个人会使用LINQ to XML,请注意:

var doc = XDocument.Load(CareerFile);
return doc.Root
          .Elements("CareerList")
          .ElementAt(1) // 0-based
          .Element("CareerDescription")
          .Value;

您应该使用SelectNodes代替SelectSingleNode:它将返回XmlNodeList nodeList。然后应该从索引为[1];

的节点列表中获取元素的InnerText
public string CareerDescription(string CareerFile)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(CareerFile);
string Description = xmlDoc.SelectNodes("Careers/CareerList/CareerDescription")[1].InnerText;
return Description;
}

详细信息请参考MSDN上关于此方法的文档:http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectnodes%28v=vs.71%29.aspx

这是LINQ到XML例程的一种直接方式(因为它是LINQ,所以我更喜欢这种方式,而不是XmlDocument的"标准"使用和XPath的支持):

return XDocument.Load(CareerFile)
                .Descendants("CareerDescription").Skip(1).First().Value;