在使用asp.net核心和XmlDataContractSerializerOutputFormatter格式化响应的情况下,如何删除根xml名称空间。
所有返回的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“部分。
发布于 2017-08-30 21:32:45
请尝试以下代码:
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>发布于 2017-09-10 16:35:01
最后,我扩展了现有的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);
}
}最后,使用hack来禁止名称空间的写入的特定适配器
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);
}
} https://stackoverflow.com/questions/45960770
复制相似问题