如何使用asp.net核心删除xml根namesapce

问题描述:

如何删除根xml命名空间,因为我使用asp.net核心和XmlDataContractSerializerOutputFormatter格式化响应。如何使用asp.net核心删除xml根namesapce

所有返回的XML文档的格式如下

<?xml version="1.0" encoding="utf-8"?> 
    <response xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     some other stuff 
    </response> 

我需要删除的xmlns:I = “http://www.w3.org/2001/XMLSchema-instance” 的一部分。

请尝试以下代码:

这段代码的
xmlDoc.Load(@"FILE_PATH"); 
XmlNodeList header_el = xmlDoc.GetElementsByTagName("response"); 

foreach (XmlNode child in header_el) 
{ 
    if (child.Attributes[0] != null) 
    child.Attributes.Remove(child.Attributes[0]); 
} 
Console.WriteLine(xmlDoc.OuterXml); 

输出是:

<?xml version="1.0" encoding="utf-8"?><response> 
    some other stuff 
</response> 
+0

我真的试图手动编辑XML作为最后的手段,并试图利用框架提供的便利但是,如果全部失败,我可能会写一个自定义格式化程序而不是XmlDataContractSerializerOutputFormatter,或者如果可能的话,修改自定义中间件的响应。 – Michael

+0

此解决方案是否有效? – imsome1

+0

正如我所说我没有直接访问的XML。格式化程序负责处理该问题。我所能做的就是用属性类(如DataContract和DataMember属性类)修饰我的模型,并更改Namespace属性,但我仍无法删除根的名称空间。例如,如果我使用自定义格式化程序手动创建xml,那么您的解决方案可能会很有用。 – Michael

我结束了扩展现有XmlDataContractSerializerOutputFormatter,窃听到创建的XmlWriter对象的方法和它环绕一个适配器来编辑功能,因为由框架代表的响应对象的结构,编辑响应并不是真正的实用和可行的解决方案。

首先格式化

public class CustomDataContractOutputFormatter : XmlDataContractSerializerOutputFormatter 
{ 
    public CustomDataContractOutputFormatter() : base(){} 
    public CustomDataContractOutputFormatter(XmlWriterSettings set) : base(set){} 
    public override XmlWriter CreateXmlWriter(TextWriter writer, XmlWriterSettings xmlWriterSettings) 
    { 
     var bas = base.CreateXmlWriter(writer, xmlWriterSettings); 
     var ret = new XmlWriterNoNamespace(); 
     ret.AdaptedWriter = bas; 
     return ret; 
    } 
} 

然后底座适配器(的一部分)

public class XmlWriterAdapter : XmlWriter 
{ 
    XmlWriter _adaptedWriter; 
    public XmlWriterAdapter():base(){} 
    public XmlWriter AdaptedWriter 
    { 
     get 
     { 
      return _adaptedWriter; 
     } 
     set 
     { 
      this._adaptedWriter = value; 
     } 
    } 
    public override WriteState WriteState { get{return _adaptedWriter.WriteState;} } 
    public override void Flush() 
    { 
     _adaptedWriter.Flush(); 
    } 
    public override string LookupPrefix(string ns) 
    { 
     return _adaptedWriter.LookupPrefix(ns); 
    } 
} 

最后的具体适配器与黑客禁用命名空间的书写

public class XmlWriterNoNamespace : XmlWriterAdapter 
{ 
    bool _skipAttribute; 
    public XmlWriterNoNamespace():base(){} 
    public override void WriteEndAttribute() 
    { 
     if(_skipAttribute) 
     { 
      _skipAttribute = false; 
      return; 
     } 
     base.WriteEndAttribute(); 
    } 
    public override void WriteStartAttribute(string prefix, string localName, string ns) 
    { 
     if(prefix.Equals("xmlns")) 
     { 
      _skipAttribute = true; 
      return; 
     } 
     base.WriteStartAttribute(prefix, localName, ns); 
    } 
    public override void WriteString(string text) 
    { 
     if(_skipAttribute) 
      return; 
     base.WriteString(text); 
    } 
}