मेरे पास मेरी एक्सएमएल फाइल में नीचे है:

<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" है?

1
Coolguy 26 अगस्त 2018, 12:18
1
आपने xelement को टैग किया है। क्या आप XElement या XmlElement का उपयोग करते हैं?
 – 
JohnyL
26 अगस्त 2018, 12:32
एक्सलेमेंट प्रिय मित्र
 – 
Coolguy
26 अगस्त 2018, 12:34
1
वैसे, शब्दावली से सावधान रहें। आप नोड मांगते हैं - यह तत्व जैसा नहीं है, क्योंकि नोड हो सकता है: XText (जिसमें XCData भी है), XDocumentType, XContainer (जिसमें XElement और XDocument होता है) , XProcessingInstruction और XComment। मेरे उत्तर में मैं नोड के प्रकार का परीक्षण करता हूं - यदि यह XElement नहीं है (क्योंकि केवल XElement [और XDocument, लेकिन हम इसे नहीं मानते हैं] का नाम हो सकता है), तो इसे बाहर निकाल दिया जाता है।
 – 
JohnyL
26 अगस्त 2018, 15:48

6 जवाब

तत्व का नाम प्राप्त करने के लिए आपको XNode को XElement में डालना होगा। XElement XNode से लिया गया है, लेकिन XNode में कोई नाम संपत्ति नहीं है, जबकि 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();
        }
    }
}
1
Bouke 26 अगस्त 2018, 15:03
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);
1
JohnyL 26 अगस्त 2018, 15:29
स्पष्टीकरण क्रम में होगा।
 – 
Peter Mortensen
26 अगस्त 2018, 14:02
फिक्स्ड :)
 – 
JohnyL
26 अगस्त 2018, 14:08
यह कोड वांछित परिणाम नहीं देता है। आउटपुट <a>123.png</a> <b>123.png</b> <c>123.png</c> है
 – 
Bouke
26 अगस्त 2018, 14:16
1
फिक्स्ड! :)
 – 
JohnyL
26 अगस्त 2018, 14:39
1
मैंने कोड अपडेट किया है जो नोड के प्रकार को ध्यान में रखता है।
 – 
JohnyL
26 अगस्त 2018, 15:30

आप XElement.ToString() के बजाय XElement.Name संपत्ति का उपयोग कर सकते हैं।

XElement element = new XElement("a", "123.png");
element.Name.ToString() // returns "a"
element.ToString() // returns "<a>123.png</a>"
0
Ghost4Man 26 अगस्त 2018, 12:38

आप एक 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;
}
0
Peter Mortensen 26 अगस्त 2018, 12:52
हाय वहाँ .. मैं सिलेक्टिंगलेनोड का उपयोग नहीं कर सकता क्योंकि मेरे पास बहुत सारे "संसाधन" नोड हैं। (मैंने अपना प्रश्न संपादित किया)। इसलिए मैं फ़ोरैच लूप का उपयोग करता हूं। कैसे लोग?
 – 
Coolguy
26 अगस्त 2018, 12:31

आप इसे इस तरह कर सकते हैं:

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

इसका परीक्षण नहीं किया गया है, लेकिन इसे काम करना चाहिए।

0
Peter Mortensen 26 अगस्त 2018, 12:52
हाय वहाँ .. मैं सिलेक्टिंगलेनोड का उपयोग नहीं कर सकता क्योंकि मेरे पास बहुत सारे "संसाधन" नोड हैं। (मैंने अपना प्रश्न संपादित किया)। इसलिए मैं फ़ोरैच लूप का उपयोग करता हूं। कैसे लोग?
 – 
Coolguy
26 अगस्त 2018, 12:32
ओपी XElement बल्कि XmlElement का उपयोग कर रहा है। कृपया, प्रश्न के तहत टिप्पणियां देखें।
 – 
JohnyL
26 अगस्त 2018, 15:38

आप वंशज विधि का उपयोग कर सकते हैं:

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

यह देना कि xmlString आपकी XML फ़ाइल है।

0
Smaiil 26 अगस्त 2018, 14:29
हां। इस उदाहरण में मैंने एक्सएमएल को एक स्ट्रिंग के रूप में माना।
 – 
Smaiil
26 अगस्त 2018, 15:35
और आपका आउटपुट क्या है?
 – 
JohnyL
26 अगस्त 2018, 15:36
यह एक XElement लौटाएगा।
 – 
Smaiil
26 अगस्त 2018, 15:39
ओपी को सभी पहले नोड्स के नाम चाहिए। मैं आपको प्रश्न को ध्यान से पढ़ने के लिए प्रोत्साहित करता हूं।
 – 
JohnyL
26 अगस्त 2018, 15:41