如何在 C # 中从 XmlNode 读取属性值?

假设我有一个 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>
306432 次浏览

试试这个:

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

编辑: 正如注释中指出的,如果属性不存在,这将引发异常。安全的方法是:

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

您可以像处理节点一样循环遍历所有属性

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


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

使用

item.Attributes["Name"].Value;

得到价值。

为了扩展 Konamiman 的解决方案(包括所有相关的 null 检查) ,下面是我一直在做的:

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


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

如果您需要的只是名称,那么使用 xpath 代替。不需要自己进行迭代并检查 null。

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

你也可以使用这个;

string employeeName = chldNode.Attributes().ElementAt(0).Name

如果使用 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><N0de></N0de><Node>标记包围的所有节点 <node>,然后循环遍历它们并读取属性“ Name”。

还有一种解决方案:

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


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

它还避免了预期属性 attributeName实际上不存在时的异常。