如何使用C#以正确的方式获取属性“action”和“filename”值?
XML:
<?xml version="1.0" encoding="utf-8" ?>
<Config version="1.0.1.1" >
<Items>
<Item action="Create" filename="newtest.xml"/>
<Item action="Update" filename="oldtest.xml"/>
</Items>
</Config>
C#:我无法获取属性值以及如何获取foreach循环中的值?怎么解决这个问题?
var doc = new XmlDocument();
doc.Load(@newFile);
var element = ((XmlElement)doc.GetElementsByTagName("Config/Items/Item")[0]); //null
var xmlActions = element.GetAttribute("action"); //cannot get values
var xmlFileNames= element.GetAttribute("filename"); //cannot get values
foreach (action in xmlActions)
{
//not working
}
foreach (file in xmlFileNames)
{
//not working
}
您的代码示例对我来说意味着很多。谢谢!
答案 0 :(得分:9)
您可以使用LINQ to XML。以下查询返回具有Action
和FileName
属性的强类型项集合:
var xdoc = XDocument.Load(@newFile);
var items = from i in xdoc.Descendants("Item")
select new {
Action = (string)i.Attribute("action"),
FileName = (string)i.Attribute("fileName")
};
foreach (var item in items)
{
// use item.Action or item.FileName
}
答案 1 :(得分:3)
GetElementsByTagName
会找到仅直接后代。该参数应该是只是标记名称,而不是元素的整个路径。
如果要在提供XPath表达式的同时搜索文档,请改用SelectNodes
。
对于您的文档,它应如下所示:
var element = (XmlElement)doc.SelectNodes("/Config/Items/Item")[0];
答案 2 :(得分:2)
您可以通过LINQ to XML实现您的要求:
// For each element that is a child of your Items element that is named Item
foreach (var item in XElement.Load("file.xml").Descendants("Items").Elements("Item"))
{
// If the element does not have any attributes
if (!item.Attributes().Any())
{
// Lets skip it
continue;
}
// Obtain the value of your action attribute - Possible null reference exception here that should be handled
var action = item.Attribute("action").Value;
// Obtain the value of your filename attribute - Possible null reference exception here that should be handled
var filename = item.Attribute("filename").Value;
// Do something with your data
Console.WriteLine("action: {0}, filename {1}", action, filename);
}
答案 3 :(得分:2)
问题中的代码存在许多问题:
1.您在GetElementsByTagName中使用XPath,只需使用标签
2.您只使用[0]
获取XmlNodeCollection中的第一个XmlNode
3.由于您只有一个XmlNode,因此您只获取字符串结果以获取属性,而不是字符串集合,然后您将尝试通过这些字符串进行枚举。
你的foreach坏了,生成的对象没有类型
以下是一个可行的代码段:
var doc = new XmlDocument();
doc.Load("test.xml");
var items = doc.GetElementsByTagName("Item");
var xmlActions = new string[items.Count];
var xmlFileNames = new string[items.Count];
for (int i = 0; i < items.Count; i++) {
var xmlAttributeCollection = items[i].Attributes;
if (xmlAttributeCollection != null) {
var action = xmlAttributeCollection["action"];
xmlActions[i] = action.Value;
var fileName = xmlAttributeCollection["filename"];
xmlFileNames[i] = fileName.Value;
}
}
foreach (var action in xmlActions) {
//working
}
foreach (var file in xmlFileNames) {
//working
}
或者,如果您在对其进行操作之前不需要集合中的所有操作和文件名,则可以对for循环中的每个操作/文件名执行操作。