如何使用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>
答
我结束了扩展现有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);
}
}
我真的试图手动编辑XML作为最后的手段,并试图利用框架提供的便利但是,如果全部失败,我可能会写一个自定义格式化程序而不是XmlDataContractSerializerOutputFormatter,或者如果可能的话,修改自定义中间件的响应。 – Michael
此解决方案是否有效? – imsome1
正如我所说我没有直接访问的XML。格式化程序负责处理该问题。我所能做的就是用属性类(如DataContract和DataMember属性类)修饰我的模型,并更改Namespace属性,但我仍无法删除根的名称空间。例如,如果我使用自定义格式化程序手动创建xml,那么您的解决方案可能会很有用。 – Michael