Как удалить атрибут xmlns с помощью .NET XML API - PullRequest
7 голосов
/ 17 сентября 2008

Методы 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.

Ответы [ 9 ]

2 голосов
/ 09 декабря 2009

Я видел различные варианты в этой теме и решил найти собственное решение для удаления атрибутов 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.

2 голосов
/ 12 февраля 2010

Большое спасибо Али Шаху, эта тема отлично решила мою проблему! Вот преобразование 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);
            }
2 голосов
/ 17 сентября 2008

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

1 голос
/ 12 января 2013
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();
}
1 голос
/ 17 сентября 2008

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

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

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

0 голосов
/ 28 марта 2015

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

   Dim pathXmlTransformado As String = "C:\Fisconet4\process\11790941000192\2015\3\28\38387-1\38387_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\process\11790941000192\2015\3\28\38387-1\teste.xml")
0 голосов
/ 10 июня 2009

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

Я проверяю это сейчас. обновит.

...