2012-04-19 34 views
0

ウェブページにボタンタグのセットがあり、innerTextが "保存"されている特定のボタンタグを1つ取得したいとします。 (それは。それまで何のIDを持っていない)だから、私はクロームコンソールでそれをしようとすると、完璧に動作します。このコードXML文書の特殊文字をエスケープする

var tags = document.getElementsByTagName("button"); 
for (var i = 0; i < tags.length; i++) { 
    if (tags[i].innerText === 'Save') { 
     tags[i].click(); 
     break; 
    } 
} 

を持っています。しかし、これを私のjellyファイルに含めることはできません(これはhtmlに処理されるxmlマークアップです.JSPのようなものです)

問題はforループ内の "<"演算子この

SAXParserException: "要素の内容は、整形式の文字データまたはマークアップで構成されている必要があります。

そして、for..inループを配列に使用しないことを学びました。私に何ができる?いくつかの回避策を提案してください。

答えて

6

を。あなたの問題は、 "XMLに<文字を含めるとXMLが壊れます"。そのような文字を正しく挿入する方法を見つけ出す必要があります。データにその文字が現れないようにする必要はありません。ループの標準を避ける必要はありません。

CDATAマーカー(CDATAシーケンスの終わりを除く)が特別であることを止めるCDATAマーカーで囲むか、XML内に&lt;という文字で<を表してください。

<![CDATA[ 
for (var i = 0; i < j; i++) { 
    etc(i); 
} 
]]> 

または

for (var i = 0; i &lt; j; i++) { 
    etc(i); 
} 
+0

うわー。非常に速く!コードを読みやすくするためにCDATAを使用しました。本当の問題を解決する方法を私に教えてくれてありがとう。 – Vigneshwaran

0

<[CDATA[ ... ]]>

編集中に置く:あなたは間違った問題を解決している...間違った構文

+1

これはCDATAマーカーではありません。コメントであり、コードを完全に削除します。 – Quentin

+0

確か...固定しました – Fender

1
var limit = tags.length; 

//loop until 0 (which is false) 
while(limit) { 
    if (tags[tags.length-limit].innerText === 'Save') { 
     tags[tags.length-limit].click(); 
     break; 
    } 
    limit--; 
} 
+1

これは私の間違った質問に対する正しい答えです。 Quentinらが指摘したように、私は間違った問題を解決しようとしていて、彼らは私に正しい解決策を与えました。とにかくあなたの答えに感謝します。 – Vigneshwaran

2

新しいArray.forEach方法で反復することができますが、それには、JavaScript 1.6からのみ利用可能です:

var tags = Array.prototype.slice.call(document.getElementsByTagName("button")); 
tags.forEach(function (tag) { 
    // ... 
}); 

しかし、本当の解決策を置くことであろうあなたのコードを<![CDATA[]]>に:

<code> 
<![CDATA[ 
var tags = document.getElementsByTagName("button"); 
for (var i = 0; i < tags.length; i++) { 
    // ... 
} 
]]> 
</code> 
+0

そしてループを「中断」することはできません。 – ThiefMaster

+0

@ThiefMasterそれは本当です。 –

関連する問題