【问题标题】:Get first node name in XML in C#在 C# 中获取 XML 中的第一个节点名称
【发布时间】:2018-08-26 09:18:33
【问题描述】:

我的 XML 文件中有以下内容:

<Resources>
    <a>123.png</a>
</Resources>
<Resources>
    <b>123.png</b>
</Resources>
<Resources>
    <c>123.png</c>
</Resources>

我想获取“Resource”的第一个节点名称,即“a”、“b”、“c”。

但是当我这样做时:

foreach (var downloadFile in downloadFiles.Elements("Resources"))
{
    if (downloadFile.Value != null)
    {
        string fileName = downloadFile.FirstNode.ToString();
     }
}

它将返回整行&lt;a&gt;123.png&lt;/a&gt;。

如何获得第一个节点名称“a”?

【问题讨论】:

  • 你标记了xelement。你使用 XElement 还是 XmlElement?
  • Xelement 亲爱的朋友
  • 顺便说一句,请注意术语。您要求 node - 这与 element 不同,因为 node 可以是:XText(也包含 XCData)、XDocumentType、XContainer(包含 XElement 和 XDocument) , XProcessingInstruction 和 XComment。在我的回答中,我测试了节点的类型 - 如果它不是 XElement(因为只有 XElement [和 XDocument,但我们不认为它] 可以有名称),那么它就会被抛出。

标签: c# .net xml element xelement


【解决方案1】:

您需要将 XNode 转换为 XElement 才能获取元素名称。 XElement 是从 XNode 派生的,但是 XNode 没有 Name 属性,而 XElement 有。

using System;
using System.Xml.Linq;

namespace StackOverflow
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var xml = XElement.Parse(@"
<root>
    <Resources>
        <a>123.png</a>
    </Resources>
    <Resources>
        <b>123.png</b>
    </Resources>
    <Resources>
        <c>123.png</c>
    </Resources>
</root>");

            var resourceElements = xml.Elements("Resources");
            foreach (var resourceElement in resourceElements)
            {
                // Cast from XNode to XElement
                var desiredElement = resourceElement.FirstNode as XElement; 
                if (desiredElement != null) // In case first node is not an element, but for instance text or comment
                {
                    var elementName = desiredElement.Name;
                    Console.WriteLine(elementName);
                }
            }
            Console.ReadLine();
        }
    }
}

【讨论】:

    【解决方案2】:
    var xml = XElement.Parse(@"
    <root>
        <Resources>
            <a>123.png</a>
        </Resources>
        <Resources>
            <b>123.png</b>
        </Resources>
        <Resources>
            <c>123.png</c>
        </Resources>
    </root>");
    
    var all_first =
        xml
        .Elements("Resources") //get all Resources children
        .Select(r => r.FirstNode) //take first node of Resources element
        .OfType<XElement>() //take only XElement (rather XText, XComment etc.)
        .Select(f => f.Name) //finally, take name of the first element
        ;
    all_first.ToList().ForEach(Console.WriteLine);
    

    【讨论】:

    • 解释一下。
    • @PeterMortensen 已修复 :)
    • 这段代码没有给出想要的结果。输出为&lt;a&gt;123.png&lt;/a&gt; &lt;b&gt;123.png&lt;/b&gt; &lt;c&gt;123.png&lt;/c&gt;
    • @Bouke 已修复! :)
    • @Bouke 我已经更新了考虑节点类型的代码。
    【解决方案3】:

    您可以使用XElement.Name 属性代替XElement.ToString()。

    XElement element = new XElement("a", "123.png");
    element.Name.ToString() // returns "a"
    element.ToString() // returns "<a>123.png</a>"
    

    【讨论】:

      【解决方案4】:

      您可以使用 XML 文档:

      XmlDocument oDoc = XmlDocument.Load(yourXmlHere);
      XmlNodeList oMainNodes = oDoc.SelectNodes("/Resources");
      // Resource's first subnode (a)
      foreach(XmlNode oMainNode in oMainNodes)
      {
         XmlNode oResourceNode = oMainNode.ChildNodes[0];
         // node a
         string sResourceName = oResourceNode.Name;
      }
      

      【讨论】:

      • 嗨.. 我不能使用选择单节点,因为我有很多“资源”节点。 (我编辑了我的问题)。这就是我使用 foreach 循环的原因。伙计们怎么样?
      【解决方案5】:

      你可以这样做:

      XmlDocument xml = new XmlDocument();
      xml.LoadXml("<Resources><a>123.png</a></Resources>");
      Console.WriteLine(xml.DocumentElement.ChildNodes[0].Name);
      

      它没有经过测试,但它应该可以工作。

      【讨论】:

      • 嗨.. 我不能使用选择单节点,因为我有很多“资源”节点。 (我编辑了我的问题)。这就是我使用 foreach 循环的原因。伙计们怎么样?
      • OP 使用的是 XElement 而不是 XmlElement。请参阅问题下的 cmets。
      【解决方案6】:

      你可以使用Descendants方法:

       XElement element = XElement.Parse(xmlString)
              .Descendants()
              .FirstOrDefault();
      

      将 xmlString 指定为您的 XML 文件。

      【讨论】:

      • 是的。在此示例中,我将 XML 视为字符串。
      • 你的输出是什么?
      • 它将返回一个 XElement。
      • OP 需要所有第一个节点的名称。我鼓励你仔细阅读问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多