Получить имя первого узла в XML в C # - PullRequest
0 голосов
/ 26 августа 2018

У меня есть ниже в моем файле 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();
     }
}

Будет возвращена вся строка <a>123.png</a>.

Как мне получить имя первого узла, которое "a"?

Ответы [ 6 ]

0 голосов
/ 26 августа 2018

Вам нужно привести 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();
        }
    }
}
0 голосов
/ 26 августа 2018

Вы можете использовать Потомки метод:

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

Указание, что xmlString является вашим XML-файлом.

0 голосов
/ 26 августа 2018
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);
0 голосов
/ 26 августа 2018

Вы можете использовать свойство XElement.Name вместо XElement.ToString().

XElement element = new XElement("a", "123.png");
element.Name.ToString() // returns "a"
element.ToString() // returns "<a>123.png</a>"
0 голосов
/ 26 августа 2018

Вы можете сделать это так:

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

Не проверено, но должно работать.

0 голосов
/ 26 августа 2018

Вы можете использовать документ 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;
}
...