0

我想以编程方式在我的 web.config 文件中添加一个新规则,但我无法并得到一个错误

“System.Exception:表达式必须计算为节点集。”。

我的代码如下..

 XmlDocument doc = new XmlDocument();

         bool change = false;
         string configFile = Path.Combine( Server.MapPath("~").ToString(), "web.config");
         doc.Load(configFile);

 XmlNode xmlNode1 = cfg.XmlSection.SelectSingleNode("rewriteRules");
            XmlNode xmlNode = xmlNode1.SelectSingleNode("rule");
            if (xmlNode != null)
            {

                string nodeFormat = string.Format("<rule source='{0}'  destination='{1}' />", source, destination);
try
                {

                    XmlElement xmlElement = (XmlElement)(xmlNode.SelectSingleNode(nodeFormat));//error occured
                    if (xmlElement != null)
                    {
                        //xmlElement.SetAttribute("source", source);
                        //xmlElement.SetAttribute("destination", destination);
                        //xmlNode.AppendChild(xmlElement);
                    }

                    else
                    {
                        xmlElement = doc.CreateElement("rule");
                        xmlElement.SetAttribute("source", source);
                        xmlElement.SetAttribute("destination", destination);
                        xmlNode.AppendChild(xmlElement);
                    }
                    doc.Save(configFile);
                    //SaveWebConfig( xmlDoc );
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }

请帮我...

4

1 回答 1

1

不能使用 LINQ to XML 吗?查询/更新 XML 文件要容易得多。

例如,您可以有一个方法来查询 XML 并在元素存在时返回真/假,这取决于sourcedestination属性

public static bool RuleExists(string source, string destination)
{
     XDocument doc = XDocument.Load(HttpContext.Current
                              .Server.MapPath("your file"));

     return doc.Descendants("rewriteRules").Elements()
               .Where(e => e.Attribute("source").Value == source 
               && e.Attribute("destination").Value == destination).Any();
}

这会告诉你规则是否已经存在。然后,您可以将现有代码修改为如下内容:

XDocument xml = XDocument.Load(HttpContext.Current.Server.MapPath("your file"));

//replace with actual source/destination
if (RuleExists("About/About-Ashoka", "About/About.aspx"))
{
     //element is already in the config file
     //do something...
}
else
{
     XElement elem = new XElement("rule");
     elem.SetAttributeValue("source", source);
     elem.SetAttributeValue("destination", destination);
     xml.Element("rewriteRules").Add(elem);
     xml.Save(HttpContext.Current.Server.MapPath("your file"));
 }
于 2013-08-16T14:22:35.180 回答