2009-06-30 4 views
1

Я переписывание существующего XmlDocument, который содержит элемент, который имеет новое пространство имен по умолчанию, определенные (см ниже, элемент assemblyBinding)Добавление узлов к результатам нестандартных пространств имен в дублированных классификаторах

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <runtime> 
    <legacyCasPolicy enabled="true" /> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

мне нужно иметь возможность добавлять новые узлы к этому элементу «assemblyBinding», не переучивая пространство имен (поскольку среда выполнения .net затем считает Xml недействительной при обработке полученного файла в виде файла app.config).

Это то, что я хочу:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <runtime> 
    <legacyCasPolicy enabled="true" /> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 

     <dependentAssembly> 
     <assemblyIdentity name="Dependency" publicKeyToken="9f10d5ba1865867c"/> 
     </dependentAssembly> 

    </assemblyBinding> 
    </runtime> 
</configuration> 

... элемент '' dependentAssembly inherts пространства имен его родителей.

После вызова XmlDocument.CreateElement ("dependAssembly"); OR XmlDocument.CreateElement ("dependAssembly", "urn: schemas-microsoft-com: asm.v1"); OR XmlDocument.CreateElement ("asm", "dependAssembly", "urn: schemas-microsoft-com: asm.v1");

я получаю что-то вроде этого ...

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <runtime> 
    <legacyCasPolicy enabled="true" /> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 

     <asm:dependentAssembly xmlns:asm="urn:schemas-microsoft-com:asm.v1"> 
     <asm:assemblyIdentity name="Dependency" publicKeyToken="9f10d5ba1865867c" xmlns:asm="urn:schemas-microsoft-com:asm.v1"/> 
     </asm:dependentAssembly> 

    </assemblyBinding> 
    </runtime> 
</configuration> 

Что мне нужно сделать, чтобы получить то, что я хочу?

ответ

0

Если вы используете .NET 3.5, вы можете использовать LINQ to XML. Например, этот код:

XNamespace ns = "uri:ns"; 
XDocument doc = new XDocument 
    (new XElement("root", 
        new XElement(ns + "child", new XAttribute("xmlns", ns), 
           new XElement(ns + "grandchild")))); 
doc.Save("test.xml"); 

Результаты в этом XML:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <child xmlns="uri:ns"> 
    <grandchild /> 
    </child> 
</root> 

Я пытался получать тот же результат с XmlDocument, и до сих пор я не смог ...

0

версии с и без asm: prefix одинаковы. В обоих случаях элементы assemblyBinding, dependentAssembly и assemblyIdentity находятся в пространстве имен urn:schemas-microsoft-com:asm.v1.

0

Я попытался с помощью AppendChildElement на XPathNavigator в документе и, похоже, не добавить несколько деклараций пространства имен таким образом (пример не добавляет все необходимые элементы, но вы получите идею):

 XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(
      @"<?xml version='1.0' encoding='utf-8' ?> 
       <configuration> 
        <runtime> 
        <legacyCasPolicy enabled='true' /> 
        <assemblyBinding xmlns='urn:schemas-microsoft-com:asm.v1'> 
        </assemblyBinding> 
        </runtime> 
       </configuration> 
      ");  
     NameTable nt = new NameTable(); 
     XmlNamespaceManager nsm = new XmlNamespaceManager(nt); 
     nsm.AddNamespace("x", "urn:schemas-microsoft-com:asm.v1"); 

     XPathNavigator node = doc.CreateNavigator().SelectSingleNode("//x:assemblyBinding", nsm); 
     node.AppendChildElement("", "dependentAssembly", "urn:schemas-microsoft-com:asm.v1", ""); 

Фред

+0

На самом деле, вы попробовали XmlDocument.CreateElement ("", "dependAssembly", "urn: schemas-microsoft-com: asm.v1"); т.е. с пустым префиксом, как в моем примере выше? – fredw

Смежные вопросы