2

HTTPリクエストからのXML応答を解析するルーチンがあり、これを行うためにXmlDocument.LoadXmlを使用しています。私はこのメソッドが不正なXMLで例外をスローし、成功したときにロードされたXmlDocumentオブジェクトを返すことを期待しています。

私が予想していなかったのは、ドキュメントの読み込み中に数分間ハングすることです。このコードをテスト環境で実行すると、100%の時間数分間ハングします。私には.NETのバグのように見えます...

    Dim tstring As String = ""

    tstring &= "" & vbCrLf
    tstring &= "" & vbCrLf
    tstring &= "<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">" & vbCrLf
    tstring &= "" & vbCrLf
    tstring &= "<html> xmlns=""http://www.w3.org/1999/xhtml"" >" & vbCrLf
    tstring &= "<head><title>" & vbCrLf
    tstring &= "    Error" & vbCrLf
    tstring &= "</title></head>" & vbCrLf
    tstring &= "<body>" & vbCrLf
    tstring &= "</body>" & vbCrLf
    tstring &= "</html>" & vbCrLf

    Dim MyXmlDoc As New XmlDocument
    MyXmlDoc.LoadXml(tstring)

ドキュメントがぶら下がらないようにするために削除できるドキュメントの特定の行は次のとおりです。

    tstring &= "<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">" & vbCrLf

文字列内で「<!DOCTYPEhtml」を検索する必要がありますか?表示された場合はLoadXml()を呼び出さないでください。これについての私の懸念は、このメソッド内で他の落とし穴が私を待っていることです。

4

1 に答える 1

9

loadxml呼び出しは、検証の目的でdoctypeを解析しているため、そのURLをフェッチする必要があります。この場合は低速です。ブラウザで直接テストできます。

別の質問は回避策を提供します-引用する:

.NET 4.0では、XmlTextReaderにはDtdProcessingというプロパティがあります。DtdProcessing.Ignoreに設定すると、DTD処理が無効になります。

doc.XmlResolver = null;

for.NET3.5が機能するはずです。

于 2012-09-14T17:01:57.810 に答える