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中删除。 我想这是因为这个属性的特殊含义。

问题是如何使用.NET XML API删除xmlns属性。 显然我可以从String的表示中删除该属性,但我想知道是否可以使用API​​执行相同的操作。

@Edit:我说的是.NET 2.0。

===============>>#1 票数:2

我看到了这个线程中的各种选项,并且解决了我自己的解决方案,用于删除xml中的xmlns属性。 这工作正常,没有问题:

'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

没有必要做任何其他事情从xml中删除xmlns。

===============>>#2 票数:2

非常感谢Ali Shah,这个线程完美地解决了我的问题! 这是一个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);
            }

===============>>#3 票数:2 已采纳

.NET DOM API不支持修改元素的命名空间,这是您基本上要尝试的操作。 因此,为了解决您的问题,您必须以这种或那种方式构建新文档。 您可以使用相同的.NET DOM API并创建新元素,而无需指定其名称空间。 或者,您可以创建一个XSLT样式表,将原始的“命名空间”文档转换为新的文档,其中的元素不是名称空间限定的。

===============>>#4 票数:1

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();
}

===============>>#5 票数:1

这不应该删除命名空间吗?

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

但无论如何,在这里切线,System.Xml.Linq命名空间(.Net 3.0)中的XElement,XDocument和XNameSpace类比旧的XmlDocument模型更好。 搏一搏。 我上瘾了。

===============>>#6 票数:0

这是我在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")

===============>>#7 票数:0

是的,因为它是一个ELEMENT名称,您无法明确删除它。 使用XmlTextWriter的WriteStartElement和WirteStartAttribute,并用空格替换属性可能会完成工作。

我现在正在检查它。 会更新。

===============>>#8 票数:0

也许通过XmlNamespaceManager? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx,但这只是猜测。

===============>>#9 票数:0

我们可以将xml转换为字符串,从该字符串中删除xmlns,然后使用此字符串创建另一个XmlDocument,该字符串将不具有命名空间。

  ask by axk translate from so

未解决问题?本站智能推荐:

2回复

删除API中.NET XML序列化中类型对象属性的名称空间

如何获得此XML属性上这个不必要的名称空间? 它可以是十进制或整数。 应该 类
2回复

如何删除XDocument中根以外的节点的xmlns属性?

情况 我正在使用XDocument尝试在第一个内部节点上删除xmlns=""属性: 因此,我想要的是: 码 问题 尝试保存文档时,出现以下异常: 无法在同一开始元素标记中将前缀“”从“”重新定义为“ http://my.namespace ”。
7回复

如何防止.NET的XmlDocument输出中的空白xmlns属性?

从.NET中的XmlDocument生成XML时,第一次插入没有关联命名空间的元素时会出现空白xmlns属性; 怎么能防止这种情况? 例: 输出: 期望的输出: 是否有适用于XmlDocument代码的解决方案,而不是在将文档转换为带有OuterXml的字符串后出
1回复

Python API XML解析-命名空间

我正在使用Python解析通过API通过Tableau Server返回的XML。 涉及到命名空间,我想我可能对它们的工作方式缺乏基本的了解。 这是我的XML的样子: 这是我正在运行的代码,简化为出现问题的地方。 我的目的是首先在给定的工作簿ID下标识每个组ID,然后在该组下查找每
2回复

如果您不知道与xmlns属性关联的URI的名称,什么是查询XML文档的最佳方法?

我不想对URI进行硬编码,然后必须分配一个前缀,然后才能使用XPath表达式从XML文档中选择节点。 是否可以通过编程方式检索此信息? 这是唯一的方法吗?
3回复

如何避免添加XML元素中的xmlns =“”?

我有287个SSRS报告(XML文件),我需要添加一个参数。 它们都是这样开始的: 现在我想自动将“proc”参数添加到所有报告中。 这意味着我需要插入这一部分XML 后 这是我到目前为止的代码: 这会将XML-Fragment插入到正确的位置,但是在"p
1回复

XmlNode.InnerXml属性 - 省略xmlns属性

我有一些代码来替换XML文档的根节点名称,同时保留其名称空间。 使用如下所示的文档: 它导致: 第二个xmlns是因为InnerXml属性显然将其设置在其内容的第一个节点上! 我可以做些什么来规避这一点,而不必在事后删除它? 之后无法删除它: 尝试使用以下代
1回复

xmlns名称空间弹性

我从服务器收到的数据是utf-8编码的xml消息,看起来像 关于该示例的值得注意的是,实际上,“名称空间”限定符应该是指定默认xml名称空间的“ xmlns”限定符。 用于序列化/反序列化的代码是(自动)从模式定义文件生成的,并且xsd以及随附的文档几乎都确认这是一个错误。 但是
1回复

如何为XDocument指定xmlns?

我试过了: 但我得到: 我也试过替换(根据我发现的答案): 但也有错误。 注意 :我不是要在文档中使用多个xmlns。
1回复

如何在.NET中反序列化期间指定XML序列化属性以支持名称空间前缀?

我有以下XML: 如何在类上定义XML序列化属性以支持所描述的方案?