2017-08-30 10 views
1

asp.netコアとXmlDataContractSerializerOutputFormatterを使用して応答をフォーマットすると、root xml名前空間を削除するにはどうすればよいですか。 I = "http://www.w3.org/2001/XMLSchema-instance" 一部:asp.netコアを使用するときにxml root namesapceを削除する方法

返されるXMLドキュメントのすべては、私がのxmlnsを削除する必要があり、次の形式

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

を持っています。

答えて

1

コードを、次の試してみてください。このコードの

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

0

私は、既存の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); 
    } 
} 
関連する問題