首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用asp.net核心时删除xml根命名空间

问如何在使用asp.net核心时删除xml根命名空间
EN

Stack Overflow用户
提问于 2017-08-30 20:43:30
回答 2查看 1.1K关注 0票数 1

在使用asp.net核心和XmlDataContractSerializerOutputFormatter格式化响应的情况下,如何删除根xml名称空间。

所有返回的xml文档都具有以下格式

代码语言:javascript
复制
<?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“部分。

EN

回答 2

Stack Overflow用户

发布于 2017-08-30 21:32:45

请尝试以下代码:

代码语言:javascript
复制
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);

此代码的输出为:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?><response>
   some other stuff
</response>
票数 1
EN

Stack Overflow用户

发布于 2017-09-10 16:35:01

最后,我扩展了现有的XmlDataContractSerializerOutputFormatter,使用创建xmlwriter对象的方法,并将其包装在适配器中以编辑功能,因为由于框架所表示的响应对象的结构,编辑响应实际上并不是一个实际可行的解决方案。

首先是格式化程序

代码语言:javascript
复制
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;
    }
}

然后是基本适配器(其中一部分)

代码语言:javascript
复制
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来禁止名称空间的写入的特定适配器

代码语言:javascript
复制
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);
    }
} 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45960770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档