c# [LinQ]xml文件处理

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;
        }  
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值