Как отключить распространение xmlns детям - PullRequest
0 голосов
/ 20 июня 2011

Я хочу отделить некоторые XmlElement от одного XmlDocument, чтобы вставить его в другой. Но когда я делаю это, узлам-потомкам с пространствами имен автоматически добавляется атрибут xmlns. По какой-то причине целевой xml-файл не проходит пользовательскую проверку со всеми установленными дочерними пространствами имен. Есть ли возможность подавить xmlns размножение потомкам?

Следующий код иллюстрирует проблему - результат выполнения равен <MakesMeSick:three xmlns:MakesMeSick="http://tempuri.org" />

using System.Xml;

class Program
{
    static string xml = @"
<mydoc>
    <one xmlns:MakesMeSick=""http://tempuri.org"">
        <two>
            <MakesMeSick:three />
        </two>
    </one>
</mydoc>
";
    static void Main(string[] args)
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);
        XmlNode n = doc.SelectSingleNode("/mydoc/one/two");
        System.Console.WriteLine(n.InnerXml);
    }
}

Ответы [ 2 ]

2 голосов
/ 20 июня 2011

Если у вас есть элемент вида <prefix:localname>, то у вас должно быть где-то в этом элементе xmlns:prefix="whatever" или предка, который объясняет, на что отображается URI prefix. Просто не имеет смысла иметь префикс без ассоциированного URI.

Итак, в вашем примере вывод <MakesMeSick:three xmlns:MakesMeSick="http://tempuri.org" /> правильный. Если xmlns отсутствует, то это не будет действительный документ XML.

0 голосов
/ 20 июня 2011

Ваше намерение состоит не в том, чтобы просто скопировать элемент, а в том, чтобы преобразовать его: пространство имен является частью имени элемента в XML, как в C # или в Java. Таким образом, вам нужно применить некоторое ручное кодирование с использованием XPath и сосредоточиться на локальном имени , или для более сложных вещей, возможно, даже прибегнуть к XSLT.

...