首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在javascript中转换XML属性inot HTML标记

在javascript中转换XML属性inot HTML标记
EN

Stack Overflow用户
提问于 2014-01-29 21:22:11
回答 2查看 98关注 0票数 2

我的XML (稍微简化一下)如下所示:

代码语言:javascript
复制
<title>
  <style face="normal">Plain</style>
  <style face="bold">Bold</style>
  <style face="italic">Italics
    <style face="bold">italics and bold</style>
  just italics</style>
</title>

style节点可以嵌套在多个层次上。我想将"face“属性转换为html标记,即上面的内容应该变成类似的内容。

代码语言:javascript
复制
Plain<b>Bold</b><i>Italics<b>italics and bold</b>just italics</i>

这是我正在读取到javascript对象的一个更大的xml文件的一部分,所以这需要在javascript中实现。从概念上讲,我只想从最低层次开始,然后向外走,但我找不到一个好的方法来做到这一点。无需嵌套,只需简单地遍历所有style节点。

代码语言:javascript
复制
var htmlstring = "";
if (node.attributes.face.value == "italic"){
  htmlstring += "<i>" + node.textContent + "</i>"
} 

就行了。但很明显,一旦我有了巢,那就行不通了。一定有一个优雅的解决方案,我只是忽略了,对吧?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-29 21:45:16

递归地处理node的子级:

代码语言:javascript
复制
function replaceStyles(node) {
    var htmlstr = "";
    (function repl(node) {
        if (!node) {
            return;
        }
        if (node.attributes && 
            node.attributes.face &&
            node.attributes.face.value == "italic") {
            // I'm just building up a simple string, but you can
            // do whatever you need to with each element here
            htmlstr += "<i>" + node.textContent + "</i>";
        }
        for (var i = 0; i < node.children.length; i++) {
            repl(node.children[i], htmlstr);
        }

    })(node);
    return htmlstr;
}

当使用类似树的结构时,这是一个非常常见的问题。您希望将一些函数应用于node,然后对其每个子程序执行相同的操作,然后对它们的每个子级执行相同的操作(等等)。它是如此普遍,事实上,有完整的编程语言(例如XSLT)被设计来解决这种类型的问题。

票数 1
EN

Stack Overflow用户

发布于 2014-01-29 22:04:40

为了简洁起见,这使用jQuery。如果您需要纯JS解决方案,请告诉我。

注意:我知道OP没有要求jQuery。

代码语言:javascript
复制
var xml = $.parseXML('<title><style face="normal">Plain</style><style face="bold">Bold</style><style face="italic">Italics<style face="bold">italics and bold</style>just italics</style></title>'),
    $title = $( xml ).find('title'),
    $styles,
    htmlString = '';

while( ($styles = $title.find('style')).length ) {
    $styles.each(function() {
        var $style = $(this);
        switch( $style.attr('face') ) {
            case "bold":
                $style.replaceWith('<b>' + $style.html() + '</b>');
                break;
            case "italic":
                $style.replaceWith('<i>' + $style.html() + '</i>');
                break;

            default:
                $style.replaceWith('<span>' + $style.html() + '</span>');
                break;
        }
    });
}

console.log( $title.html() );

http://jsfiddle.net/ryanwheale/dr29J/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21442921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档