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

文書翻訳 文書翻訳
文書番号: 308060 - 対象製品
この記事は、以前は次の 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.Xml
    Imports System.IO
    Imports 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 XmlNode
    nextnode = xmldoc.FirstChild.NextSibling
    TextBox1.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 - 最終更新日: 2004年4月27日 - リビジョン: 3.1
この資料は以下の製品について記述したものです。
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft .NET Framework 1.0
キーワード:?
kbgrpdsmsxml kbhowtomaster kbmsxml KB308060
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com