2017-08-06 25 views
-1

このトピックに関する多くの質問があります。XmlWriterSettingsを使用してXmlTextWriterを継承しました

しかし、XmlWriter.Create()メソッドを使用してXmlWriterSettingsでXmlWriterをインスタンス化することを不可能にするXmlTextWriterからクラスを継承しているという独自のケースがあるようです。

質問 - 継承インスタンスのOmitXmlDeclaration、DoNotEscapeUriAttributes、CloseOutputなどのXmlWriterSettingsを指定する方法はありますか?

注:継承したクラスでFormattingプロパティを使用しましたが、XmlWriterSettingsで設定しない限り、前述のプロパティを見つけることができませんでした。

+0

No. 'CloseOutput'の場合、[XmlTextWriter.Close()']のリファレンスソース(http://referencesource.microsoft.com/#System.Xml/System/Xml/Core/XmlTextWriter.cs,839)を見ると、基礎となるテキストライターは無条件に閉じられます。基本ライターが条件付きで閉じられている['XmlUtf8RawTextWriter.Close()'](http://referencesource.microsoft.com/#System.Xml/System/Xml/Core/XmlUtf8RawTextWriter.cs,587)と比較してください。 – dbc

+0

デコレータパターンを使用して、[この回答](https://stackoverflow.com/a/42960980)から[ C#でXmlDocumentを使用して空のXML要素を自動的に閉じることを止めるにはどうすればいいですか?(https://stackoverflow.com/q/42959958) – dbc

+0

しかし、 'CloseOutput'の場合は、[BaseStreamを閉じずにStreamWriterを閉じる方法はありますか?](https:// stackoverflow)の答えの一つを使って、基本ストリームを閉じない' StreamWriter'を常に構築することができます。 com/q/2666888)。 – dbc

答えて

0

XmlTextWriterは、XmlWriterSettingsで利用可能なすべてのオプションをサポートしていません。クラスは元々の.Net 1.1でXMLを作成するために作成されたとdocsで説明したように、.NET 2.0でXmlWriter.Create()の賛成で廃止されました:

の.NET Framework 2.0以降では、我々はあなたのことをお勧めします代わりにSystem.Xml.XmlWriterクラスを使用します。

XmlWriterSettingsのフルサポートは、以前のXmlTextWriterには追加されておらず、その逆もありません。これは参照元を確認することで確認できます。あなたはreference source for XmlTextWriter.Close()を見ればたとえば

は、 CloseOutputのために、基本となるテキストライターが無条件で閉じている:

public override void Close() { 
     try { 
      AutoCompleteAll(); 
     } 
     catch { // never fail 
     } 
     finally { 
      this.currentState = State.Closed; 
      textWriter.Close(); 
     } 
    } 

XmlUtf8RawTextWriter.Close()と比較してください(このクラスはXmlWriter.Create()によって返されたXML作家の一人である)根本的なところテキストライターは条件付きで閉じている:

public override void Close() { 
     try { 
      FlushBuffer(); 
      FlushEncoder(); 
     } 
     finally { 
      // Future calls to Close or Flush shouldn't write to Stream or Writer 
      writeToNull = true; 

      if (stream != null) { 
       try { 
        stream.Flush(); 
       } 
       finally { 
        try { 
         if (closeOutput) { 
          stream.Close(); 
         } 
        } 
        finally { 
         stream = null; 
        } 
       } 
      } 
     } 
    } 

(ただし、あなたが常にANSのいずれかを使用して、基になるストリームを閉じないStreamWriterを構築することができ。Is there any way to close a StreamWriter without closing its BaseStream?からwers)

同様XmlTextWriter.WriteStartDocument()は、XML宣言を発しないためのオプションを持っているように見えません。

public override void WriteStartDocument() { 
     StartDocument(-1); 
    } 

    // Writes out the XML declaration with the version "1.0" and the standalone attribute. 
    public override void WriteStartDocument(bool standalone) { 
     StartDocument(standalone ? 1 : 0); 
    } 

    void StartDocument(int standalone) { 
     try { 
      if (this.currentState != State.Start) { 
       throw new InvalidOperationException(Res.GetString(Res.Xml_NotTheFirst)); 
      } 
      this.stateTable = stateTableDocument; 
      this.currentState = State.Prolog; 

      StringBuilder bufBld = new StringBuilder(128); 
      bufBld.Append("version=" + quoteChar + "1.0" + quoteChar); 
      if (this.encoding != null) { 
       bufBld.Append(" encoding="); 
       bufBld.Append(quoteChar); 
       bufBld.Append(this.encoding.WebName); 
       bufBld.Append(quoteChar); 
      } 
      if (standalone >= 0) { 
       bufBld.Append(" standalone="); 
       bufBld.Append(quoteChar); 
       bufBld.Append(standalone == 0 ? "no" : "yes"); 
       bufBld.Append(quoteChar); 
      } 
      InternalWriteProcessingInstruction("xml", bufBld.ToString()); 
     } 
     catch { 
      currentState = State.Error; 
      throw; 
     } 
    } 

    void InternalWriteProcessingInstruction(string name, string text) { 
     textWriter.Write("<?"); 
     ValidateName(name, false); 
     textWriter.Write(name); 
     textWriter.Write(' '); 
     if (null != text) { 
      xmlEncoder.WriteRawWithSurrogateChecking(text); 
     } 
     textWriter.Write("?>"); 
    } 

それは作家の内部状態を初期化するために呼び出されますが、呼び出されたときにすることStartDocument()必見のニーズを思わXML宣言は常に書き込まれます。

代わりにdecorator patternを使用し、XmlWriter.Create()から返された投稿者をラッピングしてデコレータに入れましたか? this answerHow can I stop empty XML elements self-closing using XmlDocument in C#に示すように、これにより、XmlTextWriterのサブクラスが基本クラスのメソッドに渡す前に出力をカスタマイズする方法と同様に、出力を下位のXmlWriterに渡す前に出力をカスタマイズすることができます。

関連する問題