সি # তে এক্সএমএলনোড থেকে বিশিষ্ট মানটি কীভাবে পড়বেন?


114

মনে করুন আমার কাছে একটি এক্সএমএল নোড রয়েছে এবং আমি "নাম" নামের একটি বৈশিষ্ট্যের মান পেতে চাই। আমি এটা কিভাবে করবো?

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)
             { 

             }
         }
      }
}

এক্সএমএল ডকুমেন্ট:

<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 (node.Attributes! = নাল) স্ট্রিং কর্মচারী নাম = chldNode.Atributes ["নাম"]। মান;
ওমিডু

7
@ ওমিদু এই পদ্ধতির একই সমস্যা রয়েছে, উদাহরণস্বরূপ <a x="1" />, যা পরীক্ষায় উত্তীর্ণ হয়। সম্ভবত কিছু var attr = node.Attributes["Name"]; if(attr != null) {...}কাজ করতে পারে।
জোয়েল পেল্টেন

কটাক্ষপাত নিচে আমার উত্তর , যা circumvents NullException সমস্যা ও, হয়তো ?, নিরাপদ ব্যবহার করতে হয়।
মার্কো 7757

44

কোনামিমানের সমাধান (সমস্ত প্রাসঙ্গিক নাল চেক সহ) প্রসারিত করতে, আমি এটি করছি:

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

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

6
নালগুলির জন্য ত্রুটি না পাওয়ার একটি সংক্ষিপ্ত উপায় হ'ল নোড ttঅ্যাট্রিবিউটস? ["নাম"] ?. মান
ব্র্যান্ডনস্ট্রং

1
এছাড়াও সত্য, যদিও আমি কেবল একটি বিষয়টিই উল্লেখ করব তা হ'ল আপনি যখন এক লাইনে এটি করতে পারেন (কোনও কার্যভার বা কোনও কিছুর জন্য এটি ভাল করে তোলা) তবে আপনি যখন কোনও ব্যতিক্রম ছুঁড়ে ফেলেন বা অন্যথায় পরিচালনা করেন নিয়ন্ত্রণ করার ক্ষেত্রে এটি কিছুটা নমনীয় নোডের কোনও বৈশিষ্ট্য নেই এমন ক্ষেত্রে।
এরি রথ

1
একমত। সংক্ষিপ্ত পথটি ব্যবহার করে এমন যে কোনও ব্যক্তির সর্বদা নিশ্চিত হওয়া উচিত যে এটি নদীর প্রবাহে সমস্যা সৃষ্টি করবে না।
ব্র্যান্ডনস্ট্রং

17

নোডের মতো আপনি সমস্ত বৈশিষ্ট্যের মধ্য দিয়ে লুপ করতে পারেন

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

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

এটি আরও বেশি পছন্দনীয় হবে .. :)
শেখর শীট

4

আপনার যদি প্রয়োজন সমস্ত নাম হয় তবে পরিবর্তে এক্সপথ ব্যবহার করুন। নিজেকে পুনরাবৃত্তি করার প্রয়োজন নেই এবং নাল পরীক্ষা করুন।

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");

উপরের পদ্ধতিগুলি আমার এক্সএমএলটির জন্য কাজ করে না (যদিও আমি তাদের ইচ্ছুক ছিলাম)। এই পদ্ধতিটি করে! ধন্যবাদ!
ফ্রেইকফুট

4

আপনি যদি এর পরিবর্তে ব্যবহার chldNodeকরেন তবে আপনি ব্যবহার করতে পারেনXmlElementXmlNode

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 employeeName = chldNode.Attributes().ElementAt(0).Name

1

তবুও আরেকটি সমাধান:

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

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

প্রত্যাশিত গুণাবলী attributeNameআসলে উপস্থিত না থাকলে এটি ব্যতিক্রম এড়িয়ে যায় ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.