【问题标题】:JQuery XML and CDATAjQuery XML 和 CDATA
【发布时间】:2018-03-29 09:01:33
【问题描述】:

我正在使用 JQuery 来解析 XML 字符串,因为我需要 在 DOM 中导航然后并获取更改的内容。我认为 JQuery 是完成这项任务的最佳工具。

rawXML 字符串:

<Root>
  <Text Title='my "best" text'><![CDATA[ Yes & No ]]></Text>
</Root>

这是我获取对象的方式:

let xml = $($.parseXML(rawXML)).find('Root');

所以我在获取 html() 函数的内容时遇到了一些麻烦:

1) 它会删除所有带有文本的CDATA*

2) 它将 attr 值的单引号替换为双引号

这段代码

console.log($($.parseXML('<Root><Text Title=\'my "best" text\'><![CDATA[ Yes & No ]]></Text></Root>')).find('Root').html());

返回&lt;Text Title="my &amp;quot;best&amp;quot; text"&gt;&lt;/Text&gt;

*我可以通过将&lt;![CDATA[ 替换为&lt;Cdata&gt; 来解决此问题,但由于&amp; 而发生错误。

可能是xml->html转换导致的问题较多。

如何“按原样”保留我的所有 XML 并在 DOM 中导航?

我更喜欢使用 JQuery,因为我的代码结果是为想要使用它的用户提供 API =)

附:这是 VSCode 扩展(Node.js)

感谢您的任何解决方案!

UPD

主要问题是我需要从字符串中获取原始 XML(它是有效的),以及它的所有引号、CDATA 等。

【问题讨论】:

  • 我想大多数问题都是由您的 XML 无效这一事实引起的。
  • @RoryMcCrossan,我的 XML 示例是有效的,不是吗?
  • 现在您添加了缺少的[,尽管我建议您坚持使用双引号来分隔值并转义这些值,如下所示:&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;Root&gt;&lt;Text Title="my &amp;quot;best&amp;quot; text"&gt;&lt;![CDATA[Yes &amp; No]]&lt;/Text&gt;&lt;/Root&gt;
  • &amp;quot;' 的完全有效的 HTML 表示,我无法重现第二个问题。您能否编辑问题并添加一个完整的 sn-p 以显示该问题?
  • 或者更好的是,完全摆脱不必要的 CDATA 并自己编码 &amp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;Root&gt;&lt;Text Title="my &amp;quot;best&amp;quot; text"&gt;Yes &amp;amp; No&lt;/Text&gt;&lt;/Root&gt;

标签: javascript jquery xml cdata


【解决方案1】:

主要问题是我需要从字符串获取原始 XML (它是有效的),以及它的所有引号、CDATA 等。

XPath 不适用于词法 XML,它适用于解析后 XML 的树表示。树表示消除了被认为不相关的区别,例如属性的顺序、单引号或双引号的选择,以及是否使用实体引用或 CDATA 部分转义特殊字符(如“&”)的决定。这是经过深思熟虑的政策,因为它认为应用程序不应该关心这些差异。所以你可能不走运。

但是,如果您解释为什么您(认为您)需要访问原始词法 XML,那么我们也许能够找到满足该要求的不同方法。

【讨论】:

  • 我需要原始 XML,因为它将被另一个程序解析。某些属性的值可以包含嵌入的脚本语言,因此应保留特殊符号,如 qoutes 和 & 符号。我正在做某种预处理器,它只会对 DOM 进行一些特殊的更改。这个任务就像改变文本,但是 JQuery 会帮它很大的帮助
  • 如果其他程序正确地使用了 XML 解析器,那么它就不会关心像在属性上使用单引号而不是双引号这样的细微差异,因为解析器会处理这些差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 2015-03-06
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多