Как удалить атрибут xmlns с помощью .NET XML API

Методы XmlElement.Attributes.Remove * отлично работают для произвольных атрибутов, в результате чего удаленные атрибуты удаляются из свойства XmlDocument.OuterXml. Однако атрибут Xmlns отличается. Вот пример:

XmlDocument doc = new XmlDocument();
doc.InnerXml = @"<Element1 attr1 = ""value1"" xmlns = ""http://mynamespace.com/"" attr2 = ""value2""/>";
doc.DocumentElement.Attributes.RemoveNamedItem("attr2");
Console.WriteLine("xmlns attr before removal = {0}", doc.DocumentElement.Attributes["xmlns"]);
doc.DocumentElement.Attributes.RemoveNamedItem("xmlns");
Console.WriteLine("xmlns attr after removal = {0}", doc.DocumentElement.Attributes["xmlns"]);

В результате получается

xmlns attr before removal=System.Xml.XmlAttribute
xmlns attr after removal=
<Element1 attr1 = "value1" xmlns = "http://mynamespace.com/" />

Атрибут кажется удаленным из коллекции Attributes, но не удален из XmlDocument.OuterXml. Думаю, это из-за особого значения этого атрибута.

Вопрос в том, как удалить атрибут xmlns с помощью .NET XML API. Очевидно, я могу просто удалить атрибут из строкового представления этого, но мне интересно, можно ли сделать то же самое с помощью API.

@Edit: я говорю о .NET 2.0.

Я просто столкнулся с этой проблемой. Хорошая находка!

Hasani Blackwell 24.10.2009 01:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
1
25 584
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Да, поскольку это имя ELEMENT, вы не можете удалить его явно. Использование WriteStartElement и WirteStartAttribute XmlTextWriter и замена атрибута пустыми пробелами, скорее всего, приведет к выполнению работы.

Сейчас проверяю. буду обновлять.

Может быть, через XmlNamespaceManager? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx, но это всего лишь предположение.

Я пробовал это, но не смог понять, как удалить пространство имен с помощью этого класса.

axk 17.09.2008 00:39
Ответ принят как подходящий

.NET DOM API не поддерживает изменение пространства имен элемента, что вы, по сути, пытаетесь сделать. Итак, чтобы решить вашу проблему, вам нужно так или иначе создать новый документ. Вы можете использовать тот же API .NET DOM и создать новый элемент, не указывая его пространство имен. В качестве альтернативы вы можете создать таблицу стилей XSLT, которая преобразует исходный документ с «пространством имен» в новый, в котором элементы не будут уточнены пространством имен.

Я не уверен, но пока нет положительного ответа, я считаю, что это правда.

axk 17.09.2008 23:18

Разве это не должно было удалить пространства имен?

XmlNamespaceManager mgr = new XmlNamespaceManager("xmlnametable");
mgr.RemoveNamespace("prefix", "uri");

Но в любом случае классы XElement, XDocument и XNameSpace из пространства имен System.Xml.Linq (.Net 3.0) намного лучше, чем старая модель XmlDocument. Попробуй. Я зависим.

Спасибо за предложение. Обязательно попробую.

axk 17.09.2008 23:16

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

Я видел различные варианты в этом потоке и пришел к своему собственному решению по удалению атрибутов xmlns в xml. Это работает правильно и без проблем:

'Remove the Equifax / Transunian / Experian root node attribute that have xmlns and load xml without xmlns attributes.
If objXMLDom.DocumentElement.NamespaceURI <> String.Empty Then
  objXMLDom.LoadXml(objXMLDom.OuterXml.Replace(objXMLDom.DocumentElement.NamespaceURI, ""))
  objXMLDom.DocumentElement.RemoveAllAttributes()
  ResponseXML = objXMLDom.OuterXml
End If

Больше ничего делать для удаления xmlns из xml не требуется.

Большое спасибо Али Шаху, эта ветка отлично решила мою проблему! вот преобразование C#:

var dom = new XmlDocument();
        dom.Load("C:/ExampleFITrade.xml));
        var loaded = new XDocument();
        if (dom.DocumentElement != null)
            if ( dom.DocumentElement.NamespaceURI != String.Empty)
            {
                dom.LoadXml(dom.OuterXml.Replace(dom.DocumentElement.NamespaceURI, ""));
                dom.DocumentElement.RemoveAllAttributes();
                loaded = XDocument.Parse(dom.OuterXml);
            }

public static string RemoveXmlns(string xml)
{
    //Prepare a reader
    StringReader stringReader = new StringReader(xml);
    XmlTextReader xmlReader = new XmlTextReader(stringReader);
    xmlReader.Namespaces = false; //A trick to handle special xmlns attributes as regular
    //Build DOM
    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.Load(xmlReader);
    //Do the job
    xmlDocument.DocumentElement.RemoveAttribute("xmlns"); 
    //Prepare a writer
    StringWriter stringWriter = new StringWriter();
    XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter);
    //Optional: Make an output nice ;)
    xmlWriter.Formatting = Formatting.Indented;
    xmlWriter.IndentChar = ' ';
    xmlWriter.Indentation = 2;
    //Build output
    xmlDocument.Save(xmlWriter);
    return stringWriter.ToString();
}

Было бы полезно небольшое повествовательное описание предложенного вами ответа.

Rob 12.01.2013 02:37

вот мое решение на vb.net, ребята!

   Dim pathXmlTransformado As String = "C:\Fisconet4\process79094100019215387-1387_transformado.xml"
    Dim nfeXML As New XmlDocument
    Dim loaded As New XDocument

    nfeXML.Load(pathXmlTransformado)

    nfeXML.LoadXml(nfeXML.OuterXml.Replace(nfeXML.DocumentElement.NamespaceURI, ""))
    nfeXML.DocumentElement.RemoveAllAttributes()

    Dim dhCont As XmlNode = nfeXML.CreateElement("dhCont")
    Dim xJust As XmlNode = nfeXML.CreateElement("xJust")
    dhCont.InnerXml = 123
    xJust.InnerXml = 123777

    nfeXML.GetElementsByTagName("ide")(0).AppendChild(dhCont)
    nfeXML.GetElementsByTagName("ide")(0).AppendChild(xJust)

    nfeXML.Save("C:\Fisconet4\process79094100019215387-1\teste.xml")

Другие вопросы по теме