库
using System.Xml;
usingSystem.Xml.Linq;
Xml Example
<ctl name="ctrl-separate" value="2" />
<path name="path1">
<ctl name="ctrl1" value="16" />
<ctl name="ctrl2" value="2" />
</path>
<path name="path2">
<path name="path1"/>
<ctl name="ctrl3" value="16" />
<ctl name="ctrl4" value="2" />
</path>
..........
XML 文件读取
XDocument doc=XDocument.Load(file);
XElement使用
IEnumerable<XElement> params =doc.Root.Elements("path");
//获取到所有attribute=path 的所有Node
//如上,可将xml 文件中所有的path信息全部整合到params中如
//params 包含path1,path2 整个信息,但不包含 "ctrl-separate"
IEnumerable<XElement> tmp = path_params?.Where(r => r.Attribute("name").Value == path_name).ToList();
假设path_name= “path2”,那这个操作获取的是path2下面所有的元素,即ctr3,ctrl4,path1
相当于path 是作为elements进行枚举的,而name为path 的attribute 属性,大家可以自己定义,可以定位为hobby等其他,只是path属下的属性。
IEnumerable<XElement> tmp_son = tmp.Elements("ctl")?.Where(r => r.Attribute("name").Value !="" ).ToList(); ;
上一个操作获得了path2下面的所以信息,有ctrl3,ctrl4,以及path1,这3个我们把他当做elements,在这些elements下获取 ctrl elements
IEnumerable<XElement> tmp_son = tmp.Elements("ctl")?.Where(r => r.Attribute("name").Value =="ctrl4" ).ToList(); ;
上一个操作获得了path2下面的所以信息
从这个操作中再去获取 attribute name=ctrl1 的数据即
<ctl name="ctrl4" value="2" />
但是这个获得的数据还是一个集合的数据 ,格式为IEnumerable<XElement>
XElement first = tmp.Elements("ctl").Where(r => r.Attribute("name").Value == "ctrl4")?.First();
if (first == null) return;
这个操作类似于
IEnumerable<XElement> tmp_son = tmp.Elements("ctl")?.Where(r => r.Attribute("name").Value =="ctrl4" ).ToList(); ;
但是获得的数据为 XElement,如果 所需的数据不是一个集合,那么这个写法就比较合适
string value=16
first.Attribute("value").Value = value;
该语句可以直接修改读出来的原数据 ,如原来
<path name="path2">
<path name="path1"/>
<ctl name="ctrl3" value="16" />
<ctl name="ctrl4" value= "2" />
</path>
修改完之后
<path name="path2">
<path name="path1"/>
<ctl name="ctrl3" value="16" />
<ctl name="ctrl4" value= "16" />
</path>
XElement node = new XElement("ApVersion", new XAttribute("name", “ap_version”),
new XElement("Version", new XAttribute("name", "A"), new XAttribute("value", "")),
new XElement("Version", new XAttribute("name", "B"), new XAttribute("value", ""))
);
doc.Root.Add(node);
通过该设置,可以直接在xml 中增加一下片段
<ApVersion name="ap_version">
<Version name="A" value="" />
<Version name="B" value="" />
</ApVersion>
doc.Save(file_path,SaveOptions.None);
在修改完xml 数据后,需要将修改的东西再次保存入文件当中,file_path即 该xml文件的位置
foreach (XElement y in tmp_son)
{
path = y.Attribute("name").Value.ToString();
}
该操作为从ctrl elements中获取到其atrribute name下对应的value。
迭代
从上面的例子中可以看到有迭代,如果想要获取全部的ctrl信息的话,可使用迭代方法。
public class XmlParser
{
private IEnumerable<XElement> ctrl_params { get; set; }
private IEnumerable<XElement> path_params { get; set; }
private List<XElement> tinymix_ctrl_info { get; set; }
private XDocument doc;
public class tinymix_info
{
public string name { get; set; }
public string value { get; set; }
}
public List<tinymix_info> tinymix_cmd_info;
public XmlParser(string file)
{
ReadXmlFile(file);
}
private void ReadXmlFile(string file)
{ if (file == "") return;
doc = XDocument.Load(file);
path_params = doc.Root.Elements("path");
}
private List<XElement> GetSelectedPathSelfCtrl(string path_name)
{
IEnumerable<XElement> tmp = path_params?.Where(r => r.Attribute("name").Value == path_name).ToList();
IEnumerable<XElement> tmp_son = tmp.Elements("ctl")?.Where(r => r.Attribute("name").Value != "").ToList(); ;
tinymix_ctrl_info.AddRange(tmp_son);
return tinymix_ctrl_info;
}
private List<XElement> GetSelectedPathInnerCtrl(string path_name)
{
IEnumerable<XElement> tmp_crtl = null;
string path;
IEnumerable<XElement> tmp = path_params?.Where(r => r.Attribute("name").Value == path_name).ToList();
IEnumerable<XElement> tmp_son = tmp.Elements("path")?.Where(r => r.Attribute("name").Value != "").ToList();
if (tmp_son.Count()>0)
{
foreach (XElement y in tmp_son)
{
path = y.Attribute("name").Value.ToString();
GetSelectedPathInnerCtrl(path);
}
}
else
tmp_crtl= tmp.Elements("ctl")?.Where(r => r.Attribute("name").Value != "").ToList();
if(tmp_crtl!=null)
tinymix_ctrl_info.AddRange(tmp_crtl);
return tinymix_ctrl_info;
}
private int HasNoPathParamInSearchedPath(string path_name)
{
IEnumerable<XElement> tmp = path_params?.Where(r => r.Attribute("name").Value == path_name).ToList();
IEnumerable<XElement> tmp_son = tmp.Elements("path")?.Where(r => r.Attribute("name").Value != "").ToList();
return tmp_son.Count();
}
private List<XElement> GetSelectedPathCtrlTinymixCrtl(string path_name)
{
tinymix_ctrl_info = new List<XElement>();
tinymix_ctrl_info = GetSelectedPathInnerCtrl(path_name);
if (HasNoPathParamInSearchedPath(path_name)>0)
{
tinymix_ctrl_info = GetSelectedPathSelfCtrl(path_name);
}
return tinymix_ctrl_info;
}
public List<tinymix_info> GetSelectedPathCtrlTinymixCmd(string path_name)
{
tinymix_cmd_info = new List<tinymix_info>();
tinymix_ctrl_info = GetSelectedPathCtrlTinymixCrtl(path_name);
foreach (XElement info in tinymix_ctrl_info)
{
tinymix_info tinfo = new tinymix_info();
tinfo.name = info.Attribute("name").Value.ToString();
tinfo.value = info.Attribute("value").Value.ToString();
tinymix_cmd_info.Add(tinfo);
}
return tinymix_cmd_info;
}
}
}