จะอ่านค่าแอตทริบิวต์จาก XmlNode ใน C # ได้อย่างไร


114

สมมติว่าฉันมี XmlNode และต้องการรับค่าของแอตทริบิวต์ชื่อ "Name" ฉันจะทำเช่นนั้นได้อย่างไร?

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
ระมัดระวังกับแนวทางนี้ ฉันคิดว่าหากไม่มีแอตทริบิวต์การเข้าถึง Value member จะทำให้เกิด Null Reference Exception
Chris Dunaway

3
if (node.Attributes! = null) สตริง staffName = chldNode.Attributes ["Name"]. value;
Omidoo

7
@Omidoo แนวทางนั้นมีปัญหาเดียวกันเช่น<a x="1" />ซึ่งผ่านการทดสอบ บางทีสิ่งที่ชอบvar attr = node.Attributes["Name"]; if(attr != null) {...}อาจใช้งานได้
Joel Peltonen

ดูคำตอบของฉันด้านล่างซึ่งหลีกเลี่ยงปัญหา NullException และอาจปลอดภัยกว่าที่จะใช้
Marco7757

44

เพื่อขยายโซลูชันของ Konamiman (รวมถึงการตรวจสอบค่าว่างที่เกี่ยวข้องทั้งหมด) นี่คือสิ่งที่ฉันทำ:

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

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

6
วิธีชวเลขที่จะไม่ได้รับข้อผิดพลาดสำหรับ null คือ node.Attributes? ["Name"] ?. value
brandonstrong

1
จริงอยู่แม้ว่าสิ่งเดียวที่ฉันจะชี้ให้เห็นก็คือในขณะที่คุณสามารถทำได้ในบรรทัดเดียว (ทำให้ดีสำหรับงานหรือบางอย่าง) แต่ก็มีความยืดหยุ่นน้อยกว่าเล็กน้อยในแง่ของการควบคุมเมื่อคุณโยนข้อยกเว้นหรือจัดการ กรณีที่โหนดไม่มีแอตทริบิวต์
Ari Roth

1
ตกลง ใครก็ตามที่ใช้วิธีชวเลขควรตรวจสอบให้แน่ใจเสมอว่าจะไม่ทำให้เกิดปัญหาที่ปลายน้ำ
brandonstrong

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 ของฉัน (แม้ว่าฉันต้องการ) วิธีนี้ทำได้! ขอบคุณ!
Frecklefoot

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ไม่มีอยู่จริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.