C# 读取和修改自定义config文件

时间:2022-01-20 08:50:44
现有个NLog.Config文件,内容如下

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true">

  <!-- 
  See https://github.com/nlog/nlog/wiki/Configuration-file 
  for information on customizing logging rules and outputs.
   -->
  <targets>
    <!-- add your targets here -->

    <!--<target xsi:type="File" name="f" fileName="${basedir}/nlogs/${shortdate}.log"
            layout="${longdate} [${uppercase:${level}}] [${callsite}] : ${message}" />-->
    <target xsi:type="File" name="fee" fileName="${basedir}/nlogs/${shortdate}.log"
        layout="${time} ${uppercase:${level}} ${message}" />
  </targets>

  <rules>
    <!-- add your logging rules here -->
    <logger name="*" minlevel="trace" writeTo="fee" />

    <!--<logger name="f2" minlevel="trace" writeTo="f2" />-->
    
  </rules>
</nlog>


我现在要动态修改<rules>节点下logger的minlevel属性。试过多种方法,无法获取,求指教!

8 个解决方案

#1


var xe = XElement.Load("t.xml");//改成xml的路径,或者用流,具体参考MSDN
var xns = xe.GetDefaultNamespace();
var minlevelattr = xe.Descendants(xns + "rules").Elements(xns + "logger").Attributes("minlevel").FirstOrDefault();
if (minlevelattr != null)
{
minlevelattr.Value = "debug"; //改成你想要的值
}
xe.Save("t.xml");//保存路径

#2


引用 1 楼 iyomumx 的回复:
var xe = XElement.Load("t.xml");//改成xml的路径,或者用流,具体参考MSDN
var xns = xe.GetDefaultNamespace();
var minlevelattr = xe.Descendants(xns + "rules").Elements(xns + "logger").Attributes("minlevel").FirstOrDefault();
if (minlevelattr != null)
{
minlevelattr.Value = "debug"; //改成你想要的值
}
xe.Save("t.xml");//保存路径

Xml.Linq很强大 C# 读取和修改自定义config文件

#3


你那个是因为命名空间原因。  仅供参考。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);

XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
if (!nsManager.HasNamespace(namespacePrefix))
      nsManager.AddNamespace(namespacePrefix, namespaceString);

//得到节点数组
xmlDoc.SelectNodes(xpath, nsManager) ;
//得到当节点
xmlDoc.SelectSingleNode(xpath, nsManager)

#4


 DataSet ds = new DataSet();
            ds.ReadXml("a.config");
            for (int i = 0; i < ds.Tables["logger"].Rows.Count; i++)
            {

                ds.Tables["logger"].Rows[i][1]=222;                

            }
            ds.WriteXml("a.config");

#5


引用 3 楼 smthgdin 的回复:
你那个是因为命名空间原因。  仅供参考。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);

XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
if (!nsManager.HasNamespace(namespacePrefix))
      nsManager.AddNamespace(namespacePrefix, namespaceString);

//得到节点数组
xmlDoc.SelectNodes(xpath, nsManager) ;
//得到当节点
xmlDoc.SelectSingleNode(xpath, nsManager)

这种解析方法指定不行!
XmlNamespaceManager是针对第一个节点(也就是<? xml ?>)含有命名空间的xml,如下面这种
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">

#6



            string path = "C:\\1.xml";
            XDocument xml = XDocument.Load(path);
            xml.Elements().First().Elements().Single(x => x.Name.LocalName == "rules").Elements().Single(x => x.Name.LocalName == "logger").SetAttributeValue("minlevel", "newvalue");
            xml.Save(path);

#7



引用 6 楼 sunny906 的回复:

            string path = "C:\\1.xml";
            XDocument xml = XDocument.Load(path);
            xml.Elements().First().Elements().Single(x => x.Name.LocalName == "rules").Elements().Single(x => x.Name.LocalName == "logger").SetAttributeValue("minlevel", "newvalue");
            xml.Save(path);

谢了,兄弟

#8


引用 5 楼 lovelj2012 的回复:
Quote: 引用 3 楼 smthgdin 的回复:

你那个是因为命名空间原因。  仅供参考。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);

XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
if (!nsManager.HasNamespace(namespacePrefix))
      nsManager.AddNamespace(namespacePrefix, namespaceString);

//得到节点数组
xmlDoc.SelectNodes(xpath, nsManager) ;
//得到当节点
xmlDoc.SelectSingleNode(xpath, nsManager)

这种解析方法指定不行!
XmlNamespaceManager是针对第一个节点(也就是<? xml ?>)含有命名空间的xml,如下面这种
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">


没关系的。我们项目的nlog也是这么用。

#1


var xe = XElement.Load("t.xml");//改成xml的路径,或者用流,具体参考MSDN
var xns = xe.GetDefaultNamespace();
var minlevelattr = xe.Descendants(xns + "rules").Elements(xns + "logger").Attributes("minlevel").FirstOrDefault();
if (minlevelattr != null)
{
minlevelattr.Value = "debug"; //改成你想要的值
}
xe.Save("t.xml");//保存路径

#2


引用 1 楼 iyomumx 的回复:
var xe = XElement.Load("t.xml");//改成xml的路径,或者用流,具体参考MSDN
var xns = xe.GetDefaultNamespace();
var minlevelattr = xe.Descendants(xns + "rules").Elements(xns + "logger").Attributes("minlevel").FirstOrDefault();
if (minlevelattr != null)
{
minlevelattr.Value = "debug"; //改成你想要的值
}
xe.Save("t.xml");//保存路径

Xml.Linq很强大 C# 读取和修改自定义config文件

#3


你那个是因为命名空间原因。  仅供参考。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);

XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
if (!nsManager.HasNamespace(namespacePrefix))
      nsManager.AddNamespace(namespacePrefix, namespaceString);

//得到节点数组
xmlDoc.SelectNodes(xpath, nsManager) ;
//得到当节点
xmlDoc.SelectSingleNode(xpath, nsManager)

#4


 DataSet ds = new DataSet();
            ds.ReadXml("a.config");
            for (int i = 0; i < ds.Tables["logger"].Rows.Count; i++)
            {

                ds.Tables["logger"].Rows[i][1]=222;                

            }
            ds.WriteXml("a.config");

#5


引用 3 楼 smthgdin 的回复:
你那个是因为命名空间原因。  仅供参考。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);

XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
if (!nsManager.HasNamespace(namespacePrefix))
      nsManager.AddNamespace(namespacePrefix, namespaceString);

//得到节点数组
xmlDoc.SelectNodes(xpath, nsManager) ;
//得到当节点
xmlDoc.SelectSingleNode(xpath, nsManager)

这种解析方法指定不行!
XmlNamespaceManager是针对第一个节点(也就是<? xml ?>)含有命名空间的xml,如下面这种
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">

#6



            string path = "C:\\1.xml";
            XDocument xml = XDocument.Load(path);
            xml.Elements().First().Elements().Single(x => x.Name.LocalName == "rules").Elements().Single(x => x.Name.LocalName == "logger").SetAttributeValue("minlevel", "newvalue");
            xml.Save(path);

#7



引用 6 楼 sunny906 的回复:

            string path = "C:\\1.xml";
            XDocument xml = XDocument.Load(path);
            xml.Elements().First().Elements().Single(x => x.Name.LocalName == "rules").Elements().Single(x => x.Name.LocalName == "logger").SetAttributeValue("minlevel", "newvalue");
            xml.Save(path);

谢了,兄弟

#8


引用 5 楼 lovelj2012 的回复:
Quote: 引用 3 楼 smthgdin 的回复:

你那个是因为命名空间原因。  仅供参考。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);

XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
if (!nsManager.HasNamespace(namespacePrefix))
      nsManager.AddNamespace(namespacePrefix, namespaceString);

//得到节点数组
xmlDoc.SelectNodes(xpath, nsManager) ;
//得到当节点
xmlDoc.SelectSingleNode(xpath, nsManager)

这种解析方法指定不行!
XmlNamespaceManager是针对第一个节点(也就是<? xml ?>)含有命名空间的xml,如下面这种
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">


没关系的。我们项目的nlog也是这么用。