Как удалить атрибут xmlns with.NET XML API
XmlElement.Атрибуты.Методы 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 ответов
.NET DOM API не поддерживает изменение пространства имен элемента, что вы по существу пытаетесь сделать. Итак, чтобы решить вашу проблему, вам нужно так или иначе создать новый документ. Вы можете использовать тот же API .NET DOM и создать новый элемент без указания его пространства имен. Кроме того, можно создать таблицу стилей XSLT, которая преобразует исходный документ "namespaced" в новый, в котором элементы не будут определены пространством имен.
Я видел различные варианты в этом потоке и пришел, чтобы решить мое собственное решение для удаления атрибутов 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 и XNameSpace классы из системы.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 и WirteStartAttribute XmlTextWriter и замена атрибута пустыми пространствами, скорее всего, выполнит эту работу.
Я проверяю это сейчас. буду обновлять.
может быть, через XmlNamespaceManager ? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx
мы можем преобразовать xml в строку, удалить xmlns из этой строки, а затем создать другой XmlDocument с помощью этой строки, которая не будет иметь пространства имен.
вот мое решение на 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")