Как удалить атрибут xmlns с помощью .NET XML API
-
09-06-2019 - |
Вопрос
XmlЭлемент.Атрибуты.Методы 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.Внешний XML.Я предполагаю, что это из-за особого значения этого атрибута.
Вопрос в том, как удалить атрибут xmlns с помощью .NET XML API.Очевидно, что я могу просто удалить атрибут из строкового представления this, но мне интересно, возможно ли сделать то же самое с помощью API.
@Редактировать:Я говорю о .NET 2.0.
Решение
.NET DOM API не поддерживает изменение пространства имен элемента, что вы, по сути, и пытаетесь сделать.Итак, чтобы решить вашу проблему, вам нужно так или иначе создать новый документ.Вы можете использовать тот же .NET DOM API и создать новый элемент, не указывая его пространство имен.В качестве альтернативы, вы можете создать таблицу стилей XSLT, которая преобразует ваш исходный документ с пространством имен в новый, в котором элементы не будут определены как пространство имен.
Другие советы
Я увидел различные варианты в этой теме и пришел к решению моего собственного решения для удаления атрибутов 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);
}
Разве это не должно было удалить пространства имен?
XmlNamespaceManager mgr = new XmlNamespaceManager("xmlnametable");
mgr.RemoveNamespace("prefix", "uri");
Но в любом случае, по касательной здесь XElement, XDocument и Пространство имен классы из пространства имен System.Xml.Linq (.Net 3.0) намного лучше, чем старая модель XmlDocument.Попробуй это сделать.Я зависим.
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();
}
Да, поскольку это имя ЭЛЕМЕНТА, вы не можете явно удалить его.Использование WriteStartElement от XmlTextWriter и WirteStartAttribute и замена атрибута пустыми пробелами, скорее всего, позволят выполнить работу.
Я сейчас это проверяю.будет обновляться.
Может быть , через XmlNamespaceManager ? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx но это всего лишь предположение.
Мы можем преобразовать xml в строку, удалить xmlns из этой строки, а затем создать другой XML-документ, используя эту строку, который не будет иметь пространства имен.
вот мое решение по 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")