在C#中,我需要使用XmlNode从这些属性中获取值,如下所示:
根元素(ServerConfig):
型
版本
createDate
子节点(Items):
名称
源
目的地
XML:
<?xml version="1.0" encoding="utf-8"?>
<ServerConfig type="ProjectName" version ="1.1.1.2" createDate ="2013-07-30T15:07:19.3859287+02:00" >
<items>
<item name="fs" type="directory" source="C:\temp\source" destination="C:\temp\target" action="Create" />
<item name="testdoc.txt" type="file" source="C:\temp\source" destination="C:\temp\target" action="Update" />
</items>
</ServerConfig>
C#:
XmlTextReader reader = new XmlTextReader(fileManager.ConfigFile);
XmlDocument doc = new XmlDocument();
XmlNode node = doc.ReadNode(reader);
// failed to get values here
var Version = node.Attributes["version"].Value;
var Type = node.Attributes["type"].Value;
var Date = node.Attributes["createDate"].Value;
//how to get values from items/item attributes here?
您的示例代码非常感谢谢谢:)
答案 0 :(得分:3)
您可以使用LINQ to XML(在最新的.Net版本中更可取)
var xdoc = XDocument.Load(fileManager.ConfigFile);
var serverConfig = xdoc.Root;
string version = (string)serverConfig.Attribute("version");
DateTime date = (DateTime)serverConfig.Attribute("createDate");
string type = (string)serverConfig.Attribute("type");
var items = from item in serverConfig.Element("items").Elements()
select new {
Name = (string)item.Attribute("name"),
Type = (string)item.Attribute("type"),
Source = (string)item.Attribute("source"),
Destination = (string)item.Attribute("destination")
};
看一看 - 几行代码和文件解析为强类型变量。即使 date 也是DateTime
对象而不是字符串。 items 是具有与xml属性对应的属性的匿名对象的集合。
答案 1 :(得分:1)
你应该使用XPath获取项目并循环结果;)
这样的事情:
foreach (XmlNode item in doc.DocumentElement.SelectNodes("items/item"))
{
var Name = item.Attributes["name"].Value;
var Source= item.Attributes["source"].Value;
var Destination = item.Attributes["destination"].Value;
}
要获取根元素,您可以使用doc.DocumentElement
;)
答案 2 :(得分:1)
您可以使用XmlSerializer
:
类:
public class ServerConfig
{
public ServerConfig()
{
Items = new List<Item>();
}
[XmlAttribute("type")]
public string Type { get; set; }
[XmlAttribute("version")]
public string Version { get; set; }
[XmlAttribute("createDate")]
public DateTime CreateDate { get; set; }
[XmlArray("items")]
[XmlArrayItem("item")]
public List<Item> Items { get; set; }
}
public class Item
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("type")]
public string Type { get; set; }
[XmlAttribute("source")]
public string Source { get; set; }
[XmlAttribute("destination")]
public string Destination { get; set; }
[XmlAttribute("action")]
public string Action { get; set; }
}
示例:
var data = @"<?xml version=""1.0"" encoding=""utf-8""?>
<ServerConfig type=""ProjectName"" version =""1.1.1.2"" createDate =""2013-07-30T15:07:19.3859287+02:00"" >
<items>
<item name=""fs"" type=""directory"" source=""C:\temp\source"" destination=""C:\temp\target"" action=""Create"" />
<item name=""testdoc.txt"" type=""file"" source=""C:\temp\source"" destination=""C:\temp\target"" action=""Update"" />
</items>
</ServerConfig>";
var serializer = new XmlSerializer(typeof(ServerConfig));
ServerConfig config;
using(var stream = new StringReader(data))
using(var reader = XmlReader.Create(stream))
{
config = (ServerConfig)serializer.Deserialize(reader);
}
答案 3 :(得分:0)
加载您的文档:
XmlDocument doc = new XmlDocument();
doc.Load(fileManager.ConfigFile);
然后您将能够使用XPath选择任何内容:
doc.SelectSingleNode(XPath);
doc.SelectNodes(XPath);
答案 4 :(得分:0)
我没有使用XmlNode
,而是使用XmlElement
,因为它有一个名为GetAttribute(string attributeName)
的好方法,比Attributes
索引器属性更容易使用在XmlNode
。而且,由于XmlElement
派生自XmlNode
,您可以在保留基础XmlNode
类的功能的同时获得附加功能。
var items = doc.DocumentElement.SelectNodes("items/item").Cast<XmlElement>().ToList();
// You can iterate over the list, here's how you'd get your attributes:
var Name = items[0].GetAttribute("name"); // Returns null if attribute doesn't exist, doesn't throw exception
var Source = items[0].GetAttribute("source");
var Destination = items[0].GetAttrubite("destination");
HTH。