在解析XML提要时,将HTML实体(例如')替换为等效字符

时间:2013-07-16 14:03:28

标签: javascript xml-parsing escaping titanium special-characters

解析XML Feed时,我从内容标记中获取文本,如下所示:

  

政府已经为St Eunan学院的重大翻新项目拨款。这是上个月宣布将其预制件替换为永久性住宿的补充。最新的补助金将允许对学校的一部分进行大规模整修,以便为课程提供新的住宿 - 该项目还将涉及屋顶维修,安装除尘系统,新的科学室配件和安装牢固的警报。多尼戈尔代表Joe McHugh表示,学分必须归学校的管理层所有。

无论如何都可以轻易地用例如撇号等替换这些特殊字符(即HTML实体)吗?

编辑:

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);

3 个答案:

答案 0 :(得分:5)

您可以在Titanium中包含许多库(Underscore.stringstring.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中使用它并且非常方便。

答案 1 :(得分:0)

以下是对这些特殊字符的两个引用,遗憾的是,通过过滤它们,您可能会过滤掉您可能实际想要保留的重要信息。我的建议是使用符号引用表来创建一个数组,然后在字符串中为每个代码执行搜索,并用适当的响应替换代码。

例如:

A-Z are represented by: &#65; to &#90;

过滤掉这些信息可能会显着改变您希望阅读的数据。

HTML符号实体参考:
http://www.webmonkey.com/2010/02/special_characters/
http://www.w3schools.com/tags/ref_symbols.asp

答案 2 :(得分:0)

我遇到过同样的问题,而@Josiah Hester的解决方案对我有用。我添加了一个条件来检查是否只处理了字符串值。

    this.unescapeHTML = function(str) {
    var escapeChars = { lt: '<', gt: '>', quot: '"', apos: "'", amp: '&' };
    if(typeof(str) !== 'string'){
        return str;
    }else{
        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;
        }});
    }
};