Добавление узлов в пространство имен не по умолчанию приводит к двойным квалификаторам - PullRequest
1 голос
/ 30 июня 2009

Я перезаписываю существующий 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>

... элемент'pendentAssembly 'наследует пространство имен своего родителя.

После звонка XmlDocument.CreateElement ( "dependentAssembly"); ИЛИ ЖЕ XmlDocument.CreateElement ("independentAssembly", "urn: schemas-microsoft-com: asm.v1"); ИЛИ ЖЕ XmlDocument.CreateElement ("asm", "зависимая сборка", "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>

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

Ответы [ 3 ]

0 голосов
/ 13 сентября 2009

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

0 голосов
/ 06 ноября 2009

Я попытался использовать 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", "");

Fred

0 голосов
/ 30 июня 2009

Если вы используете .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, и пока мне не удалось ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...