- PR -

【XML】 LoadXmlでXML文書のチェック

投稿者投稿内容
Orion
常連さん
会議室デビュー日: 2005/07/11
投稿数: 27
お住まい・勤務地: 京都府・京都市
投稿日時: 2005-08-08 15:48
XmlDocumentクラスのLoadメソッドでは、ValidationがReaderで可能ですが、LoadXmlではできません。
Validationを行おうとすると、一旦ファイルに保存後Readerを使用して行えばいいのでしょうか。

また、タグの記述ミス(たとえば、終端の>が>>になっていた場合)は、
Readerを用いたValidationでチェック可能でしょうか。
LoadXmlメソッドではエラーになりませんでした。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-08-08 16:18
>LoadXmlメソッドではエラーになりませんでした。
仕様です。
.NET Framework クラス ライブラリ
XmlDocument.LoadXml メソッド
解説
既定では、 LoadXml メソッドは空白も有意な空白も保存しません。このメソッドは、DTD 検証またはスキーマ検証を実行しません。検証を実行する場合は、 Load メソッドを使用し、そのメソッドに XmlValidatingReader を渡します。読み込み時検証の例については、「 XmlDocument 」を参照してください。
------- ヘルプより
Orion
常連さん
会議室デビュー日: 2005/07/11
投稿数: 27
お住まい・勤務地: 京都府・京都市
投稿日時: 2005-08-09 01:33
返信有難うございます。

引用:

MMXさんの書き込み (2005-08-08 16:18) より:
>LoadXmlメソッドではエラーになりませんでした。
仕様です。
.NET Framework クラス ライブラリ
XmlDocument.LoadXml メソッド
解説
既定では、 LoadXml メソッドは空白も有意な空白も保存しません。このメソッドは、DTD 検証またはスキーマ検証を実行しません。検証を実行する場合は、 Load メソッドを使用し、そのメソッドに XmlValidatingReader を渡します。読み込み時検証の例については、「 XmlDocument 」を参照してください。
------- ヘルプより



やはり一旦ファイルに保存する以外に方法はなさそうですね。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-09 01:51
XmlValidatingReaderやXmlTextReaderのコンストラクタを調べればXML文字列から作成する手法も見つかりますが。
Orion
常連さん
会議室デビュー日: 2005/07/11
投稿数: 27
お住まい・勤務地: 京都府・京都市
投稿日時: 2005-08-09 17:15
すみません。見落としていました。

引用:

Hongliangさんの書き込み (2005-08-09 01:51) より:
XmlValidatingReaderやXmlTextReaderのコンストラクタを調べればXML文字列から作成する手法も見つかりますが。



確かにコンストラクタで指定できました。
public XmlValidatingReader(string, XmlNodeType, XmlParserContext);
Orion
常連さん
会議室デビュー日: 2005/07/11
投稿数: 27
お住まい・勤務地: 京都府・京都市
投稿日時: 2005-08-12 08:39
何度もすみません。
以下のコードを書いて見たのですが、
例外は発生しませんでした。

Dim strXML As String = "<BookStore Prefecture=""27"" xmlns=""Book"">" & _
"<Store ID=""2000"">" & _
"<Order ID=""00010001"">XXXXX</Order>>" & _
"<Order ID=""00010002"">yyyyy</Order>" & _
"</Store>" & _
" </BookStore>"
Dim reader As XmlValidatingReader = Nothing
Dim bSuccess = False
Dim strX As String
Dim strXML = "
Try
'Create the XmlNamespaceManager that is used to
'look up namespace information.
Dim nt As New NameTable
Dim nsmgr As New XmlNamespaceManager(nt)
nsmgr.AddNamespace(String.Empty, "urn:Book")

'Create the XmlParserContext.
Dim context As New XmlParserContext(Nothing, nsmgr, Nothing, XmlSpace.None)

'Implement the reader.
reader = New XmlValidatingReader(strXML, XmlNodeType.Element, context)
reader.ValidationType = ValidationType.None

'Parse the XML fragment. If they exist, display the
'prefix and namespace URI of each element.
While reader.Read()
strX = reader.Name
Trace.Write(strX + vbCrLf)
End While
bSuccess = True

Catch ex As Exception
MessageBox.Show("Error")

Finally
If Not (reader Is Nothing) Then
reader.Close()
End If
End Try


多分僕がValidationReader等の知識がないからだと思うのですが、
どのようにして上記のXMLが間違っているという解析をすればいいかわかりません。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-08-12 09:16
>reader.ValidationType = ValidationType.None
ValidationType=ValidationType。無
とは?
None
XML 1.0 準拠の非検証パーサーを作成します。既定の属性が報告され、一般エンティティは ResolveEntity を呼び出して解決できます。DOCTYPE は、検証目的では使用されません。
検証エラーはスローされません。
---- ヘルプより
掲示板書き込みして、待つ時間が好きなタイプですか?(細木数子より、穏やかな口調)
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-12 09:27
引用:

Orionさんの書き込み (2005-08-12 08:39) より:
コード:
Dim strXML As String = "<BookStore Prefecture=""27"" xmlns=""Book"">" & _
                       "<Store ID=""2000"">" & _
                       "<Order ID=""00010001"">XXXXX</Order>>" & _
                       "<Order ID=""00010002"">yyyyy</Order>" & _
                       "</Store>" & _
                       " </BookStore>"



ひょっとして</Order>>のこの>二つ目を検出したいのでしょうか?

ValidationTypeがNoneである以上、Validationは行われません。読み込んでもvalidかどうかは保証されません(何に対してvalidか、と言うところから不明ですし)。
またwell-formedかどうかは、別にXmlValidatingReaderでなくとも、XmlTextReaderであっても検証されます(well-formedでなければ読み込み時に例外が発生します)。

XMLにおいて、>は別にテキストノードに使っちゃいけない文字ではありません。
ですからこのXMLはwell-formedです。例外は発生しません。

スキルアップ/キャリアアップ(JOB@IT)