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++;
}
然而它不起作用。请帮忙。
答案 0 :(得分:3)
您的属性名称为name
,而不是message name
(message
是节点的名称。)
如果您能够更清楚地描述您想要做的事情,我(或其他人)可以提供更具体的解决方案。
答案 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);