c#读取属性值

时间:2011-02-28 14:19:42

标签: c#

ich有一个xml文件,结构如下:

<layer1 name="this is layer1">
  <messages>
    <message name ="com_request">0</message>
    <message name="send">1</message>
    <message name="request">2</message>
  </messages>
</layer1>

我尝试使用代码收集一个索引器中的所有消息名称:

SampleCollection<string> paramCollection = new SampleCollection<string>();

string pathxml = @"C:\myXML.xml";
int j=0;

XmlTextReader xmlin = new XmlTextReader(pathxml);
XmlDocument xmldoc = new XmlDocument();
XmlNode node = xmldoc.ReadNode(xmlin);

foreach (XmlNode item in node.ChildNodes)
{
   paramCollection[j] = item.Attributes["message name"].Value;
   Console.WriteLine(paramCollection[j]);
   j++;
}

然而它不起作用。请帮忙。

7 个答案:

答案 0 :(得分:3)

您的属性名称为name,而不是message namemessage是节点的名称。)

如果您能够更清楚地描述您想要做的事情,我(或其他人)可以提供更具体的解决方案。

答案 1 :(得分:1)

属性名称不是 message name,它是name

foreach (XmlNode item in node.ChildNodes)
{
   paramCollection[j] = item.Attributes["name"].Value;
   Console.WriteLine(paramCollection[j]);
   j++;
}

答案 2 :(得分:1)

试试这个:

XmlDocument xmldoc = new XmlDocument();

XmlNodeList list = xmldoc.SelectNodes("/layer1/messages/message");
List<string> messageNames = new List<string>();

foreach (XmlNode node in list)
{
   messageNames.Add(node.Attributes["name"].Value);    
}

这应该使用XPath提取所有<message>个节点,然后将他们的@name属性抓取到字符串列表中。

答案 3 :(得分:1)

您的节点选择错误。它需要更像:

string pathxml = @"C:\myXML.xml";
int j=0;

XmlTextReader xmlin = new XmlTextReader(pathxml);
XmlDocument xmldoc = new XmlDocument();
XmlNode node = xmldoc.ReadNode(xmlin);

foreach (XmlNode item in xmldoc.SelectNodes("layer1/messages/message"))
{
    paramCollection[j] = item.Attributes["name"].Value;
    Console.WriteLine(paramCollection[j]);
    j++;
}

因此,您获得了foreach迭代的消息节点集合。然后该属性被简单引用为“名称”

答案 4 :(得分:1)

除了其他人提到的内容(属性名称错误)之外,您的节点也指向layers1,其中只有直接子messages,因此没有message个节点在你的孩子收藏中。在LINQ中同样的事情是微不足道的 - 如果你可以切换:

XDocument doc = XDocument.Load(@"test.xml");
foreach (var item in doc.Descendants("message"))
{
    Console.WriteLine(item.Attribute("name").Value);
}

答案 5 :(得分:0)

如果您使用Linq to XML

var doc = XDocument.Load(@"d:\temp\myXml.xml");
var msgnames = from q in doc.Descendants("message")
               select q.Attribute("name").Value; 

foreach(string item in msgnames)
{
    Console.WriteLine(item);
}

答案 6 :(得分:0)

首先,正如其他人所指出的,您的属性称为name

至于在XML树中收集某些值的任务,您可以使用XPath语言来查询文档。这将使您能够避免编写遍历树的样板代码,并轻松适应XML结构更改

var doc = new XmlDocument ();
doc.LoadXml (xs);

var attrs = doc.SelectNodes ("/layer1/messages/message/@name");
var values = attrs.Cast<XmlAttribute> ()
    .Select (a => a.Value);

但是,由于我已经使用LINQ将节点转换为属性实例,使用LINQ to XML是有意义的,它用于从C#代码查询XML

var doc = XDocument.Parse (xs);
var values = from msg in doc.Descendants ("message")
             select msg.Attribute ("name").Value;

Console.WriteLine (values);

这两个选项都很好,取决于您计划使用哪个框架来处理XML,System.Xml或LINQ to XML。对于新代码,我建议使用LINQ。

在这两种情况下,您都需要一个简单的foreach循环来枚举值:

foreach (string value in values)
    Console.WriteLine (value);