1. ホーム
  2. javascript

[解決済み] XMLフィードのパース時にHTMLエンティティ(例:’)を同等の文字に置き換えます。

2022-02-05 07:19:11

質問

XMLフィードをパースする際、contentタグから以下のようなテキストを取得しています。

政府は、セント・ユーナンズ・カレッジの大規模な改修プロジェクトを進めるための資金提供を決定しました。これは、先月発表された、プレハブを恒久的な住居に変更するための助成金に加えてのことです。今回の助成金により、学校の一部を大規模に改修し、新しい教室を作ることができる。このプロジェクトでは、屋根の修理、除塵システムの設置、新しい科学室の備品、警報装置の設置も行われる予定である。ドニゴール州副州知事のJoe McHugh氏は、学校の経営陣の功績を称えるべきであると述べています。

例えばアポストロフィーなどのためのこれらの特殊文字(つまりHTMLエンティティ)を簡単に同等の文字に置き換える方法はないのでしょうか?

EDIT

Ti.API.info("is this real------------"+win.dataToPass)


を返します。(わかりやすくするために改行を追加)

[INFO][TiAPI   ( 5437)]  Is this real------------------Police in Strabane are
warning home owners and car owners in the town to be vigilant following a recent
spate of break-ins. There has been a number of thefts from gardens and vehicles
in the Jefferson Court and Carricklynn Avenue area of the town. The PSNI have
said that residents have reported seeing a dark haired male in and around the
area in the early hours of the morning. Local Cllr Karina Carlin has been
monitoring the situation – she says the problem seems to be getting
worse…….


私のexternal.jsファイルは以下の通りです。つまり、単に上のテキストを表示するものです。

var win= Titanium.UI.currentWindow;

Ti.API.info("Is this real------------------"+ win.dataToPass);

var escapeChars = { lt: '<', gt: '>', quot: '"', apos: "'", amp: '&' };

function unescapeHTML(str) {//modified from underscore.string and string.js
    return str.replace(/\&([^;]+);/g, function(entity, entityCode) {
        var match;

        if ( entityCode in escapeChars) {
            return escapeChars[entityCode];
        } else if ( match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
        } else if ( match = entityCode.match(/^#(\d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }
    });
}

var newText= unescapeHTML(win.datatoPass);


var label= Titanium.UI.createLabel({
    color: "black",
    //text: win.dataToPass,//this works!
    text:newText,//this is causing an error
    font: "Helvetica",
    fontSize: 50,
    width: "auto",
    height: "auto",
    textAlign: "center"
})

win.add(label);

解決方法は?

Titaniumに組み込むことができるライブラリはたくさんあります( アンダースコア.string , 文字列.js を使えば実現できるのですが、もし unescape html 関数は、上記のライブラリから引用した次のコードを試してみてください。

var escapeChars = { lt: '<', gt: '>', quot: '"', apos: "'", amp: '&' };

function unescapeHTML(str) {//modified from underscore.string and string.js
    return str.replace(/\&([^;]+);/g, function(entity, entityCode) {
        var match;

        if ( entityCode in escapeChars) {
            return escapeChars[entityCode];
        } else if ( match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
        } else if ( match = entityCode.match(/^#(\d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }
    });
}

これは、これらの特殊文字を人間が読みやすい派生文字に置き換え、変更後の文字列を返します。私はTitaniumでこれを使ったことがありますが、とても便利でした。