現在オフラインです。再接続するためにインターネットの接続を待っています

[HOW TO] Visual Basic .NET で XML ファイル内の特殊文字を見つけて置換する方法

この記事は、以前は次の ID で公開されていました: JP308060
概要
この資料では、Visual Basic .NET を使用して XML (Extensible Markup Language) ファイル内の特殊文字を置換する方法について説明します。

先頭に戻る

技法の説明

XML には、以下に示す 5 種類の特殊文字に対するエンティティ参照が事前に定義されています。エンティティ参照が存在しない場合、これらの特殊文字はマークアップ言語の一部として処理されます。

文字名エンティティ参照文字参照数値参照
アンパサンド&&&
左山かっこ&lt;<&#38;#60;
右山かっこ&gt;>&#62;
二重引用符&quot;"&#39;
アポストロフィ&apos;'&#34;


左山かっこ、アンパサンドなどの区切り文字は、エンティティ参照や文字参照を使うことによって文字データとして認識させることができます。同じ目的で数値文字参照も使用できます。数値文字参照とは、認識されると同時に展開され、文字データとして処理される参照です。たとえば、左山かっこを文字データとして認識させたい場合は、数値文字参照 &#60; を使用し、アンパサンドを認識させたい場合は &#38; を使用します。

次の 2 つのエンティティを宣言する場合は次のように対処します。
  • lt
  • amp
これらのエンティティは内部エンティティとして宣言します。このとき、内部エンティティの置換テキストが、左山かっこまたはアンパサンドへの文字参照になるようにします。つまり、これらのエンティティは置換処理を 2 回行わないと、正しく表示されません。

また、次の 3 つのエンティティを宣言する場合には次のように対処します。
  • gt
  • apos
  • quot
これらのエンティティも内部エンティティとして宣言しますが、置換処理は 1 回だけしか必要ないため、置換テキストに文字参照を使用する必要はありません。

先頭に戻る

特殊文字の置換が必要かどうかを判断する方法

置換が不要な場合 : XML ファイルのデータがデータベースから取り出されるとき

Microsoft .NET Framework を使用している場合、XML のデータはデータベースから取り出されてデータセットに保存されます。WriteXml メソッドを使用してデータをデータセットから XML ファイルへ書き出している場合、「概要」に示した特殊文字はそれぞれの文字参照に置換されます。そのため、データセット使用して XML ファイルを書き出しているときには、特殊文字の置換処理は不要です。

先頭に戻る

置換が必要な場合 : 特殊文字を含んだ XML ファイルを使用するとき

サードパーティが作成した XML ファイルまたは XML データには、特殊文字が使用されている可能性があります。そのような XML データを XmlDocument オブジェクトまたは XmlReader オブジェクトに読み込むと、エラーが発生します。

たとえば、XML データにアンパサンド文字が含まれている場合、次のエラー メッセージが表示されます。
entity_name を解析中にエラーが発生しました。行 #、位置 # です。
"行#" および "位置 #" は、特殊文字が何行目の何文字目に存在するかを表します。

XML データに左山かっこ文字が含まれている場合、次のエラー メッセージが表示されます。
'<' 文字、16 進数値 0x3C を名前に含むことはできません。行 #、位置 # です。
このエラー メッセージの "行 #" および "位置 #" は、最初の左山かっこの位置ではなく、2 つ目の左山かっこの位置を示しています。

XML ファイルに含まれる特殊文字が、右山かっこ (>)、二重引用符 (")、またはアポストロフィー (') の場合、特殊文字の置換処理は 1 回しか必要ないため、XmlReader オブジェクトと XmlDocumenet オブジェクトによって直接処理されます。

先頭に戻る

特殊文字を置換する方法

アンパサンドと左山かっこ文字を置換するには、次の手順を実行します。
  1. XML ファイルを作成します。
  2. Visual Basic .NET プログラムを作成し、次の手順でコードを挿入します。
先頭に戻る

XML ファイルの作成

次のコードをコピーしてメモ帳に貼り付け、customers.xml というファイル名で保存します。
<?xml version="1.0" standalone="yes"?><Customers><Customer><CustomerID>BLAUS</CustomerID><CompanyName>Blauer See Delikatessen</CompanyName><ContactName>Hanna Moos</ContactName><Region>test<ing</Region></Customer><Customer><CustomerID>SPLIR</CustomerID><CompanyName>Split Rail Beer & Ale</CompanyName><ContactName>Art raunschweiger</ContactName><Region>WY</Region></Customer></Customers>
先頭に戻る

Visual Basic .NET プロジェクトの作成

  1. 新しい Visual Basic .NET Windows アプリケーションを作成します。
  2. ツールボックスから、TextBox を 1 つ、Button コントロール を 2 つ、DataGrid を 1 つフォームにドラッグ アンド ドロップします。
  3. TextBox の [Multiline] プロパティを "True" に設定します。
  4. 次の名前空間をインポートします。
    Imports System.XmlImports System.IOImports System.Data.SqlClient
  5. 次のセクションを見つけます。
    Inherits System.Windows.Forms.Form
    このセクションの直下に、次のコード サンプルをコピーして貼り付けます。
     Dim filepath As String = "C:\customers.xml"Private Sub ReplaceSpecialChars(ByVal linenumber As Long)        Dim strm As StreamReader        Dim strline As String        Dim strreplace As String        Dim tempfile As String = "C:\temp.xml"        Try            FileCopy(filepath, tempfile)        Catch ex As Exception            MessageBox.Show(ex.Message)        End Try        Dim strmwriter As New StreamWriter(filepath)        strmwriter.AutoFlush = True        strm = New StreamReader(tempfile)        Dim i As Long = 0        While i < linenumber - 1            strline = strm.ReadLine            strmwriter.WriteLine(strline)            i = i + 1        End While        strline = strm.ReadLine        Dim lineposition As Int32        lineposition = InStr(strline, "&")        If lineposition > 0 Then            strreplace = "&amp;"        Else            lineposition = InStr(2, strline, "<")            If lineposition > 0 Then                strreplace = "&lt;"            End If        End If        strline = Mid(strline, 1, lineposition - 1) + strreplace + Mid(strline, lineposition + 1)        strmwriter.WriteLine(strline)        strline = strm.ReadToEnd        strmwriter.WriteLine(strline)        strm.Close()        strm = Nothing        strmwriter.Flush()        strmwriter.Close()        strmwriter = Nothing    End Sub    Public Function LoadXMLDoc() As XmlDocument        Dim xdoc As XmlDocument        Dim lnum As Long        Dim pos As Long        Dim Newxml As String        Try            xdoc = New XmlDocument()            xdoc.Load(filepath)        Catch ex As XmlException            MessageBox.Show(ex.Message)            lnum = ex.LineNumber            ReplaceSpecialChars(lnum)            xdoc = LoadXMLDoc()        End Try        Return (xdoc)    End Function
  6. Button1 の Click イベントに次のコードをコピーして貼り付けます。
    Dim xmldoc As New XmlDocument()xmldoc = LoadXMLDoc()Dim nextnode As XmlNodenextnode = xmldoc.FirstChild.NextSiblingTextBox1.Text = nextnode.OuterXml
  7. Button2 の Click イベントに次のコードをコピーして貼り付けます。
    Dim ds As New DataSet()        Dim xdoc As New XmlDocument()        Dim cnNwind As New SqlConnection("Data source=myservername;user id=myuser;Password=mypassword;Initial catalog=Northwind;")        Dim daCustomers As New SqlDataAdapter("Select customerid,companyname,contactname, region from customers where region='WY'", cnNwind)        Dim filepath As String        Try            daCustomers.Fill(ds, "Customers")            DataGrid1.DataSource = ds.Tables(0)            ds.WriteXml("C:\Dataset.xml")            xdoc.Load("C:\Dataset.xml")            Dim nextnode As XmlNode            nextnode = xdoc.FirstChild.NextSibling            TextBox1.Text = nextnode.OuterXml.ToString        Catch ex As Exception            MessageBox.Show(ex.Message)        End Try
  8. Microsoft SQL Server を実行しているサーバーへの接続に使用するサーバー名、ユーザー名、およびパスワードを変更します。
  9. プロジェクトをビルドして実行します。
  10. Button1 をクリックします。

    このとき表示されるエラー メッセージの意味は、「置換が必要な場合 : 特殊文字を含んだ XML ファイルを使用するとき」に説明したとおりです。問題の XML データは TextBox に表示されます。アンパサンドは &amp; に置換され、左山かっこは &lt; に置換されています。
  11. Button2 をクリックします。

    DataGrid の companyname にはアンパサンドが正常に表示されています。TextBox 内の XML データには &amp; が表示されています。
先頭に戻る
関連情報
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
251354 HOW TO: Locate and Replace Special Characters in an XML Document with Visual Basic
先頭に戻る
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 308060 (最終更新日 2002-03-08) をもとに作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。
プロパティ

文書番号:308060 - 最終更新日: 04/27/2004 09:04:36 - リビジョン: 3.1

  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft .NET Framework 1.0
  • kbgrpdsmsxml kbhowtomaster kbmsxml KB308060
フィードバック