转义jQuery.parseXML()

时间:2017-03-27 15:53:07

标签: javascript jquery xml

我从服务器收到文本响应,看起来像<label>&lt;sometext&gt;my Label&lt;/sometext&gt;</label>。问题是当我执行jQuery.parseXML()从此响应中创建xml文档时。最终创建<label><sometext>my Label</sometext></label>。在解析xml时如何逃避这些尖括号?

1 个答案:

答案 0 :(得分:1)

&lt;&gt;是HTML实体,允许您在XML / HTML中打印小于(<)和大于(>)个字符类似的文档,不将它们解析为标记。

有两种方法可以解释您的问题,我不确定您的意思,所以我会尝试解决这两个问题:

  1. 您希望JQuery“忽略”已经转义的字符 - 这意味着JQuery应该将您的字符串解析为具有文本内容label的{​​{1}}节点(请记住,"<sometext>my Label</sometext>"将在解析的HTML中显示为&lt;,即

    <
  2. 这几乎肯定是JQuery已经在做的事情。很难看到它,因为字符将打印相同,但您可以通过尝试以下来验证它:

    label
        |--- "<sometext>my Label</sometext>"
    

    第三行将打印var result = $.parseXML("<label>&lt;sometext&gt;myLabel&lt;/sometext&gt;</label>"); console.log(result); console.log(result.children[0].textContent); ,即此字符串是"<sometext>myLabel</sometext>"标记的文本内容,而不是另一个节点本身(如果是,它将显示在label中)。

    1. 您希望JQuery将转义的字符视为标记标记 - 另一个选项是您 希望JQuery将result.children[0].children[0]视为另一个XML节点,给出:

      sometext
    2. 通过让服务器在字符串有效负载中发送未转义的字符,可以最好地解决这个问题。但另外你可以像这样替换字符串中的字符:

      label
          |---sometext
               |---"my Label"
      

      最后一行打印var string = "<label>&lt;sometext&gt;myLabel&lt;/sometext&gt</label>" .replace(/&[l|g]t;/g, function(c) { if (c === "&lt;") { return "<"; } else { return ">"; } }); var result = $.parseXML(string); console.log(result); console.log(result.children[0]); console.log(result.children[0].children[0].textContent); ,表明my Label确实被解析为父节点。

      编辑:只考虑第三种解释

      1. 您希望能够按字面显示转义字符,即sometext而不是&lt; - 这将提供以下树:

        <
      2. 要实现此目的,您可以再次使用函数替换字符:

        label
            |--- "&lt;sometext&gt;my Label&lt;/sometext&gt;"
        

        这里我们转义&符号var string = "<label>&lt;sometext&gt;myLabel&lt;/sometext&gt;</label>".replace(/&[l|g]t;/g, function(c) { if (c === "&lt;") { return "&amp;lt;"; } else { return "&amp;gt;"; } }); result = $.parseXML(string); ,以便实体不被识别为整体。