4

私は XML ファイルを作成する必要がありますが、パートナーはヘッダーにかなり固執しています。どうやら、ヘッダーはまさにこれでなければなりません:

<?xml version="1.0"?>

しかし、XML ファイルを作成するたびに、次のような無関係なプロパティが取得されます。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

私のハッカーは、XMLWriter を使用してファイルを作成するのをやめて、ヘッダーをより細かく制御できるようにしたいと考えています。「問題ありません。独自の XML タグを StreamWriter または何かとして作成するループを作成します。この XMLWriter オブジェクトは忘れてください...」しかし、XMLWriter はこれまでのところ使用するのがかなり洗練されていたことを認めなければなりません。XMLWriterSettings オブジェクトを変更して、「カスタム プロパティを XML ヘッダーに追加するのをやめてください」と言うことができる何かがあるに違いありません。

関連する VB コードは次のとおりです。

    Dim settings As New XmlWriterSettings()
    settings.Indent = True
    settings.IndentChars = "    "
    settings.NewLineChars = "\n"
    Using writer As XmlWriter = XmlWriter.Create(strFileName, settings)
            writer.WriteStartDocument(True)
            For Each kvp As KeyValuePair(Of String, String) In dictArguments

                 Dim key As String = kvp.Key
                 Dim value As String = kvp.Value

                 writer.WriteStartElement(key)
                 writer.WriteString(value)
                 writer.WriteEndElement()

            Next

    End Using

完全に動作します。しかし、ヘッダーを制御する方法が見つかりません。もちろん、完全に削除する方法を見つけることはできますが、それは私たちがやりたいことではありません。

編集:助けてくれてありがとう。これまで WriteStartDocument を削除すると、standalone = yes が表示されなくなりました。ただし、エンコーディングの追加を停止することはできません。何か案は?

4

5 に答える 5

10

これを行う 1 つの方法は、次のように WriteProcessingInstruction メソッドを使用して、最初の処理命令を自分で制御することです。

    Dim settings As New XmlWriterSettings()
    settings.Indent = True
    settings.IndentChars = "    "
    Using writer As XmlWriter = XmlWriter.Create(strFileName, settings)
        writer.WriteProcessingInstruction("xml", "version='1.0'")
        writer.WriteStartElement("root")
        For Each kvp As KeyValuePair(Of String, String) In dictArguments

            Dim key As String = kvp.Key
            Dim value As String = kvp.Value

            writer.WriteStartElement(key)
            writer.WriteString(value)
            writer.WriteEndElement()

        Next
        writer.WriteEndElement()

    End Using

辞書に複数の要素が含まれている場合に備えて、「ルート」要素も追加したことに注意してください(辞書のキー値はどれも「ルート」ではないと推測しています:)

于 2009-06-22T16:44:28.607 に答える
2

質問されてから数ヶ月が経ちましたが、私が偶然見つけた(長年の?)解決策について言及しなければならないと感じています。xmldeclaration全体が不要になり、必要なのは、procesing命令を記述して、必要な宣言だけを書き直すことだけです。

XmlFragmentWriter-Xml宣言とXSDおよびXSI名前空間を省略します

そしてこれがVBのクラスです

Imports System.Xml
Imports System.IO
Imports System.Text

Class XmlFragmentWriter
Inherits XmlTextWriter

Public Sub New(ByVal w As TextWriter)
    MyBase.New(w)
End Sub

Public Sub New(ByVal w As Stream, ByVal encoding As Encoding)
    MyBase.New(w, encoding)
End Sub

Public Sub New(ByVal filename As String, ByVal encoding As Encoding)
    MyBase.New(New FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None), encoding)
End Sub


Private _skip As Boolean = False

Public Overrides Sub WriteStartAttribute(ByVal prefix As String, ByVal localName As String, ByVal ns As String)
    ' STEP 1 - Omits XSD and XSI declarations. 
    ' From Kzu - http://weblogs.asp.net/cazzu/archive/2004/01/23/62141.aspx
    If prefix = "xmlns" AndAlso (localName = "xsd" OrElse localName = "xsi") Then
        _skip = True
        Return
    End If
    MyBase.WriteStartAttribute(prefix, localName, ns)

End Sub

Public Overrides Sub WriteString(ByVal text As String)
    If _skip Then
        Return
    End If
    MyBase.WriteString(text)

End Sub

Public Overrides Sub WriteEndAttribute()
    If _skip Then
        ' Reset the flag, so we keep writing.
        _skip = False
        Return
    End If
    MyBase.WriteEndAttribute()

End Sub

Public Overrides Sub WriteStartDocument()
    ' STEP 2: Do nothing so we omit the xml declaration.
End Sub
End Class

そしてここでの使用法:

    Dim f As New XmlSerializer(GetType(OFXg))
      Dim w As New XmlFragmentWriter("c:\books1.xml", Nothing)
      w.Formatting = Formatting.Indented
      w.WriteProcessingInstruction("xml", "version=""1.0""")
      f.Serialize(w, RTofx)
      w.Close()

もちろん、OFXgクラスはXMLSerializableです

于 2010-10-06T11:16:46.750 に答える
1

ヘッダーにカスタムプロパティがあると思うのはなぜですか?

WriteStartDocumentは、スタンドアロン属性の有無にかかわらずヘッダーを書き込みます。あなたのコードはあなたがあなたのパートナーが受け入れないと言った属性を追加します。

「utf-16」の生成に使用されたコードは表示されませんでしたが、StringWriterに書き込まれたと思われます。.NETの文字列は常にUNICODEであり、文字列に書き込むと常にutf-16を取得します。ストリームに書き込むと、エンコーディングを制御できるようになります。

于 2009-06-22T16:01:35.193 に答える
-1

これ:

XmlWriterSettings xmlWriterSettings 
    = new XmlWriterSettings { OmitXmlDeclaration = true, };

これを提供します:

<?xml version="1.0"?>
于 2012-02-16T22:12:43.827 に答える