2010-12-22 42 views
4

我试图在运行时向我的Web.config文件添加一个新的dependentAssembly。到目前为止,我当前的代码有以编程方式将dependentAssembly添加到运行时 assemblyBinding

XmlNamespaceManager manager = new XmlNamespaceManager (WebConfigDoc.NameTable); 
    manager.AddNamespace("bindings", "urn:schemas-microsoft-com:asm.v1"); 

    XmlNode root = WebConfigDoc.DocumentElement; 

    XmlNode assemblyBinding = root.SelectSingleNode("//bindings:assemblyBinding", manager);   

    XmlNode newAssemblyBinding = WebConfigDoc.ImportNode(GetElement(MyNewNode()), true); 

    assemblyBinding.AppendChild(newAssemblyBinding);  
} 

private string MyNewNode() 
{  
    string Node = "<dependentAssembly>" + 
        "<assemblyIdentity name=\"newone\" "+ 
        " publicKeyToken=\"608967\" />" + 
        "<bindingRedirect oldVersion=\"1\" newwVersion=\"2\" />" + 
        "</dependentAssembly>"; 
    return Node ; 
} 

这工作,但结果节点是这个

<dependentAssembly xmlns=""> 
    <assemblyIdentity name="newone" publicKeyToken="608967" /> 
    <bindingRedirect oldVersion="1" newVersion="2" /> 
</dependentAssembly> 

我不需要的xmlns=""属性附加。

有没有更好的方法来做到这一点?

谢谢。

+0

好问题,+1。请参阅我的答案以获得解释和完整而简单的解决方案。 – 2010-12-22 19:15:25

+0

你问*有没有更好的方法来做到这一点?*除了@Dimitre正确的答案,我认为XSLT更适合这项任务。 – 2010-12-22 20:30:43

回答

1

我不知道为什么它不工作可能是XML序列化。名称空间是正确的,因为XmlNode assemblyBinding对象不是空的,我指定的代码就是我正在做的事情,仅此而已。这可能是由于GetElement方法从一个字符串创建XmlNode并返回一个新的文档元素。

private static XmlElement GetElement(string xml) 
     { 
      //convert string to xml element 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(xml); 
      return doc.DocumentElement; 
     } 

我反正用XPathNavigator实现了结果。我的最终版本。

XmlNamespaceManager manager = new XmlNamespaceManager (WebConfigDoc.NameTable); 
     manager.AddNamespace("bindings", "urn:schemas-microsoft-com:asm.v1"); 

     XmlNode root = WebConfigDoc.DocumentElement; 


XPathNavigator assemblyBinding = root.CreateNavigator(). 
               SelectSingleNode("//bindings:assemblyBinding", manager); 

       assemblyBinding.AppendChild(MyNewNode()); 

private string MyNewNode() 
{ 

    string Node = "<dependentAssembly>" + 
             "<assemblyIdentity name=\"newone\" "+ 
             " publicKeyToken=\"608967\" />" + 
             "<bindingRedirect oldVersion=\"1\" newwVersion=\"2\" />" + 
            "</dependentAssembly>"; 
      return Node ; 
} 

感谢您的帮助。

2

问题是因为当父节点位于“urn:schemas-microsoft-com:asm.v1”命名空间中时,您添加的新节点位于“no namespace”中。

解决方案

更改

string Node = "<dependentAssembly>" + 

string Node = "<dependentAssembly xmlns='urn:schemas-microsoft-com:asm.v1'>" + 
相关问题