ImportNode создает пустой атрибут xmlns - PullRequest
8 голосов
/ 02 декабря 2010

Обновление этого кода:

   var tmpNewNode = xdoc.ImportNode(newNode, true);

    if (oldNode.ParentNode != null)
    {
        oldNode.ParentNode.ReplaceChild(tmpNewNode, oldNode);
        return true;
    }

tmpNewNode создан с пустым атрибутом xmlns (xmlns = "").Любое предложение, как я могу избежать этого?

10x

Ответы [ 6 ]

8 голосов
/ 06 декабря 2010

Вероятно, здесь происходит то, что newNode происходит из документа без объявленного пространства имен, но oldNode находится в документе с пространством имен. В этой ситуации узел переносит свое пустое пространство имен в новый документ, и он обнаруживается явно. Если честно, если это только проблема сравнения строк, не помешает просто удалить все экземпляры xmlns = "" из строки XML перед началом работы с ней.

0 голосов
/ 07 июня 2016

Наконец я решил этот открывающий xml файл и заменил все вхождения xmlns "" пустой строкой.

Возможно, это не элегантное решение, но простое и работает нормально.

//remove void xmlns
File.WriteAllText(filename, Regex.Replace(File.ReadAllText(filename), "xmlns=\"\"", ""));
0 голосов
/ 14 апреля 2016

Попробуйте:

oldNode.InnerXml = tmpNewNode.InnerXml
0 голосов
/ 01 сентября 2011

У меня возникла та же проблема, когда я создал XmlElement, как здесь

XmlElement xmlElement = myXmlDocument.CreateElement("MyElemenent");
myXmlDocument.AppendChild(xmlElement);

после этого я получил атрибут xmlns = "" после сохранения.

Если бы я использовал пространство имен документа, я мог бы подавить этот атрибут xmlns.

XmlElement xmlElement = myXmlDocument.CreateElement("MyElemenent",myXmlDocument.DocumentElement.NamespaceURI);
myXmlDocument.AppendChild(xmlElement);

Без пустого xmlns = "" мои SelectNodes больше не работали, потому что необходимо указать пространство имен. Решение для этого здесь (с использованием -xpath-with-default-namespace)

0 голосов
/ 11 декабря 2010

В соответствии с тем, что MarkXA сказал :

Здесь, вероятно, происходит то, что newNode происходит из документа без объявленного пространства имен, но oldNode находится в документе сПространство имен.В этой ситуации узел переносит свое пустое пространство имен в новый документ, и он обнаруживается явно.

Вы можете манипулировать строкой для целей сравнения, но узлы в DOM не будутпространство имен правильно определено, что может вызвать проблемы позже, если вы попытаетесь его использовать.

Правильным решением было бы сначала создать newNode с правильной квалификацией пространства имен.Под квалификацией пространства имен я подразумеваю пространства имен, используемые в импортируемой DOM.

0 голосов
/ 06 декабря 2010

добавить пространство имен по умолчанию в ваш xdoc

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