C # में XmlNode से विशेषता मान कैसे पढ़ें?


114

मान लीजिए मेरे पास एक XmlNode है और मैं "नाम" नामक एक विशेषता का मूल्य प्राप्त करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?

XmlTextReader reader = new XmlTextReader(path);

XmlDocument doc = new XmlDocument();
XmlNode node = doc.ReadNode(reader);

foreach (XmlNode chldNode in node.ChildNodes)
{
     **//Read the attribute Name**
     if (chldNode.Name == Employee)
     {                    
         if (chldNode.HasChildNodes)
         {
             foreach (XmlNode item in node.ChildNodes)
             { 

             }
         }
      }
}

XML दस्तावेज़:

<Root>
    <Employee Name ="TestName">
    <Childs/>
</Root>

जवाबों:


214

इसे इस्तेमाल करे:

string employeeName = chldNode.Attributes["Name"].Value;

संपादित करें: जैसा कि टिप्पणियों में बताया गया है, यह एक अपवाद फेंक देगा यदि विशेषता मौजूद नहीं है। सुरक्षित तरीका है:

var attribute = node.Attributes["Name"];
if (attribute != null){
    string employeeName = attribute.Value;
    // Process the value here
}

34
इस दृष्टिकोण से सावधान रहें। मुझे लगता है कि यदि विशेषता मौजूद नहीं है, तो मान सदस्य तक पहुंचने से अशक्त संदर्भ अपवाद हो जाएगा।
क्रिस ड्यूनावे

3
if (नोड। एट्रिब्यूट्स! = null) स्ट्रिंग कर्मचारी नाम = chldNode.Attributes ["Name]] मान।
ओमिडू

7
@Omidoo उस दृष्टिकोण में एक ही मुद्दा है, उदाहरण के लिए <a x="1" />, जो परीक्षण पास करता है। शायद कुछ var attr = node.Attributes["Name"]; if(attr != null) {...}काम आ जाए।
जोएल पेल्टनन

नीचे मेरे उत्तर पर एक नज़र डालें , जो NullException समस्या को दरकिनार करता है और, शायद ?, उपयोग करने के लिए सुरक्षित है।
मार्को। .५ Mar

44

कोनामिमान के समाधान (सभी प्रासंगिक शून्य जांच सहित) का विस्तार करने के लिए, यह वही है जो मैं कर रहा हूं:

if (node.Attributes != null)
{
   var nameAttribute = node.Attributes["Name"];
   if (nameAttribute != null) 
      return nameAttribute.Value;

   throw new InvalidOperationException("Node 'Name' not found.");
}

6
Nulls के लिए एक त्रुटि नहीं मिलने का एक छोटा तरीका है नोड। एट्रिब्यूट्स? ["नाम"]। मूल्य
ब्रैंडोनस्ट्रॉन्ग

1
यह भी सच है, हालांकि केवल एक चीज जो मैं इंगित करता हूं वह यह है कि जब आप एक पंक्ति में ऐसा कर सकते हैं (किसी असाइनमेंट या किसी चीज़ के लिए इसे अच्छा बना सकते हैं), यह एक अपवाद या अन्यथा हैंडल को नियंत्रित करने के मामले में थोड़ा कम लचीला होता है मामला जहां नोड की कोई विशेषता नहीं है।
अरी रोथ

1
माना। जो कोई भी आशुलिपि का उपयोग करता है, उसे हमेशा यह सुनिश्चित करना चाहिए कि इससे समस्याएँ कम न हों।
ब्रेंडनस्ट्रॉन्ग

17

आप सभी विशेषताओं के माध्यम से लूप कर सकते हैं जैसे आप नोड्स के साथ करते हैं

foreach (XmlNode item in node.ChildNodes)
{ 
    // node stuff...

    foreach (XmlAttribute att in item.Attributes)
    {
        // attribute stuff
    }
}

यह अधिक श्रेयस्कर होगा .. :)
SHEKHAR SHETE

4

यदि आपको सभी नामों की आवश्यकता है, तो इसके बजाय xpath का उपयोग करें। खुद से पुनरावृत्ति करने की आवश्यकता नहीं है और अशक्त के लिए जाँच करें।

string xml = @"
<root>
    <Employee name=""an"" />
    <Employee name=""nobyd"" />
    <Employee/>
</root>
";

var doc = new XmlDocument();

//doc.Load(path);
doc.LoadXml(xml);

var names = doc.SelectNodes("//Employee/@name");

ऊपर दिए गए तरीके मेरे XML के लिए काम नहीं करते (हालांकि मैं चाहता था कि वे)। यह विधि करता है! धन्यवाद!
फ्रीक्लेफूट

4

आप का उपयोग करते हैं chldNodeके रूप में XmlElementके बजाय XmlNode, आप उपयोग कर सकते हैं

var attributeValue = chldNode.GetAttribute("Name");

वापसी मान सिर्फ एक खाली स्ट्रिंग हो जाएगा , मामले में विशेषता नाम मौजूद नहीं है।

तो आपका लूप इस तरह दिख सकता है:

XmlDocument document = new XmlDocument();
var nodes = document.SelectNodes("//Node/N0de/node");

foreach (XmlElement node in nodes)
{
    var attributeValue = node.GetAttribute("Name");
}

यह टैग से <node>घिरे हुए सभी नोड्स का चयन करेगा <Node><N0de></N0de><Node>और बाद में उनके माध्यम से लूप करेगा और "नाम" विशेषता को पढ़ेगा।




1

अभी तक एक और समाधान:

string s = "??"; // or whatever

if (chldNode.Attributes.Cast<XmlAttribute>()
                       .Select(x => x.Value)
                       .Contains(attributeName))   
   s =  xe.Attributes[attributeName].Value;

यह भी अपवाद से बचा जाता है जब अपेक्षित विशेषता attributeNameवास्तव में मौजूद नहीं होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.