3

次のようなノード値を持つ.vbsファイルにxmlファイルを作成しています。

  <car>David's</car>
  <company>Mannar & Co.</company>

このxmlを解析しているときに、&などの問題が見つかりました。

可能なすべてのxml特殊文字をエンコードされた文字(関数などを使用)で変換して、解析中に元のコンテンツを取得できるようにします。

ありがとうございます。

4

3 に答える 3

8

これは古い投稿ですが、これが誰かの悲しみを救うことを願って返信しています

XML ですべての特殊文字がエスケープされていない場合があるとベンダーが不満を漏らした問題に取り組んでいました。エスケープは非常に一般的なタスクのように聞こえるため、開発者がフレームワークによって提供される一部の機能ではなく、独自のロジック (関数) を使用していることに驚きました。修正前の機能は次のとおりです。

Function HTML_Encode(byVal string)
  Dim tmp, i 
  tmp = string
  For i = 160 to 255
    tmp = Replace(tmp, chr(i), "&#" & i & ";")
  Next
  tmp = Replace(tmp, chr(34), "&quot;")
  tmp = Replace(tmp, chr(39), "&apos;")
  tmp = Replace(tmp, chr(60), "&lt;")
  tmp = Replace(tmp, chr(62), "&gt;")
  tmp = Replace(tmp, chr(38), "&amp;") <- the problem: this line should be the first replacement
  tmp = Replace(tmp, chr(32), "&nbsp;")
  HTML_Encode = tmp
End Function

面白いことに、この投稿に対する回答の 1 つとまったく同じように見えます (おそらくここからコピーされたものです :-)。

特殊文字が置き換えられている順序に問題をたどりました。アンパサンド ( &)の置換は、最初の置換 (行) である必要があります。これは、置換 (: など)&quot;がアンパサンドを挿入し、それが に置換されるため&amp;です。たとえば、次の文字列がある場合: We <3 SO. 元の (上記の) 関数は、次のようにエスケープしますWe &amp;lt;3 SO。正しいエスケープは次のとおりWe &lt;3 SOです。

したがって、改訂された関数は次のようになります。

  Function HTML_Encode(byVal string)
      Dim tmp, i 
      tmp = string

      tmp = Replace(tmp, chr(38), "&amp;") <- Must be the first replacement (Thanks Aaron)

      For i = 160 to 255
        tmp = Replace(tmp, chr(i), "&#" & i & ";")
      Next

      tmp = Replace(tmp, chr(34), "&quot;")
      tmp = Replace(tmp, chr(39), "&apos;")
      tmp = Replace(tmp, chr(60), "&lt;")
      tmp = Replace(tmp, chr(62), "&gt;")
      tmp = Replace(tmp, chr(32), "&nbsp;")
      HTML_Encode = tmp
    End Function

完全を期すために、ここで XML の定義済みエンティティを見つけることができます

于 2014-11-02T05:28:48.170 に答える
0

Based on the comment of OP here i version i made myself, couldn't find a reliable one, i think it covers all possible ascii characters

Function HTML_Encode(byVal string)
  Dim tmp, i 
  tmp = string
  For i = 160 to 255
    tmp = Replace(tmp, chr(i), "&#" & i & ";")
  Next
  tmp = Replace(tmp, chr(34), "&quot;")
  tmp = Replace(tmp, chr(39), "&apos;")
  tmp = Replace(tmp, chr(60), "&lt;")
  tmp = Replace(tmp, chr(62), "&gt;")
  tmp = Replace(tmp, chr(38), "&amp;")
  tmp = Replace(tmp, chr(32), "&nbsp;")
  HTML_Encode = tmp
End Function

Function HTML_Decode(byVal encodedstring)
  Dim tmp, i
  tmp = encodedstring
  tmp = Replace(tmp, "&quot;", chr(34) )
  tmp = Replace(tmp, "&apos;", chr(39))
  tmp = Replace(tmp, "&lt;"  , chr(60) )
  tmp = Replace(tmp, "&gt;"  , chr(62) )
  tmp = Replace(tmp, "&amp;" , chr(38) )
  tmp = Replace(tmp, "&nbsp;", chr(32) )
  For i = 160 to 255
    tmp = Replace(tmp, "&#" & i & ";", chr(i))
  Next
  HTML_Decode = tmp
End Function

str = "This !@#± is a & test!"
wscript.echo HTML_Encode(str) '=> This&nbsp;!@#&amp;#177;&nbsp;is&nbsp;a&nbsp;&amp;&nbsp;test!
wscript.echo HTML_Decode(HTML_Encode(str)) '=> This !@#± is a & test!
于 2012-06-06T10:12:09.483 に答える
0

別のキーを見つけたとき、私のキーはまだ冷たくありませんでした。出力がわずかに異なるため、これを別の回答として提供します。最適なキーを選択できます。混乱しないように元の回答を削除しました

Function Escape(s) 
  Dim scr
  Set scr = CreateObject("MSScriptControl.ScriptControl")
  scr.Language = "VBScript"
  scr.Reset
  Escape = scr.Eval("escape(""" & s & """)")
End Function

Function Unescape(s)
  Dim scr
  Set scr = CreateObject("MSScriptControl.ScriptControl")
  scr.Language = "VBScript"
  scr.Reset
  Unescape = scr.Eval("unescape(""" & s & """)")
End Function

wscript.echo Escape("This !@#± is a & test!") '=> This%20%21@%23%B1%20is%20a%20%26%20test%21
wscript.echo Unescape(Escape("This !@#± is a & test!")) '=> This !@#± is a & test!
于 2012-06-06T10:35:26.867 に答える