【问题标题】:Use Javascript E4X to selectively rename XML tags使用 Javascript E4X 选择性地重命名 XML 标记
【发布时间】:2009-11-24 19:45:52
【问题描述】:

我正在使用 javascript 在非浏览器上下文(无 DOM)中操作 XML,并且正在寻找 E4X 表达式来重命名标签列表。对于任何给定的标签,我不一定提前知道它叫什么,我只想在它包含给定子字符串的情况下重命名它。

作为我非常人为的例子,我可能有:

someXML = <Favourites>
              <JillFaveColour>Blue</JillFaveColour>
              <JillFaveCandy>Smarties</JillFaveCandy>
              <JillFaveFlower>Rose</JillFaveFlower>
          <Favourites>

我想把 XML 变成:

<Favourites>
    <GaryFaveColour>Blue</GaryFaveColour>
    <GaryFaveCandy>Smarties</GaryFaveCandy>
    <GaryFaveFlower>Rose</GaryFaveFlower>
<Favourites>

但是,标签可能更多或更少,我不会提前知道它们的全名是什么。如果它们包含给定的子字符串,我只会重命名它们(在我的示例中,子字符串是“Jill”)。

【问题讨论】:

    标签: javascript xml e4x mirth


    【解决方案1】:

    要重命名元素,请使用setLocalName(newName)。对于您的“我事先不知道所有标签名称”的问题,只需遍历元素并调用它们的 localName() 方法(如果是 node.length() === 1 &amp;&amp; node.nodeKind() === "element")来获取它们的标签名称。

    【讨论】:

    • 谢谢。 localName() 和 setLocalName() 绝对是我完成这项工作所需的方法。我的“Javascript:权威指南”的第 5 版副本在 E4X 的覆盖范围内相当稀疏,但后来我在 wso2.org 上找到了一个不错的教程。
    【解决方案2】:

    类似:

    var children= someXML.children();
    for (var i= children.length; i-->0;)
        if (children[i].nodeKind()==='element')
            element.setLocalName(element.localName().split('Jill').join('Gary'));
    

    【讨论】:

    • 一个问题,对象没有split 方法。我想你想打电话给localName().split(...)name().localName.split(...)
    • 另外,name() 不安全,因为它不能被信任; setLocalName("0"): name().localName == "0", localName() == (the old localName()
    【解决方案3】:

    考虑手动添加 deleting 那些节点?

    //msg is your xml object
    msg['Favorites']['GaryFaveColor'] = msg['Favorites']['JillFaveColour'];
    msg['Favorites']['GaryFaveCandy'] = msg['Favorites']['JillFaveCandy'];
    msg['Favorites']['GaryFaveFlower'] = msg['Favorites']['JillFaveFlower'];
    
    //now del Jill
    delete msg['Favorites']['JillFaveColour'];
    delete msg['Favorites']['JillFaveCandy'];
    delete msg['Favorites']['JillFaveFlower'];
    

    【讨论】:

    • 这种方式的问题是,我事先并不知道所有的标签名称。我最终可能需要处理带有 标签的 XML。我只知道每当标签名称包含“Jill”时,我都需要将其转换为“Gary”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    相关资源
    最近更新 更多