DOMParser 在解析 xml 的时候,如果含有&符号,会失败

2022-02-15 09:23:30 +08:00
 yazoox
export function convertStringToDOM(strXml: string): Document {
  const parser = new DOMParser();
  const doc = parser.parseFromString(strXml, "application/xml");
  return doc;
}

这里的 strXml 比如,

<test clsid="g16A07941-BC15-4D48-A880-9D5A211D5065" ID="g16A07941-BC15-4D48-A880-9D5A211D5066">
    <Db clsid="g16A07941-BC15-4D48-A880-9D5A211D5093" ID="ga92">
        <Prop propname="db1">/a/b/c/d</Prop>
        <Prop propname="db1">1 & 2</Prop>
    </Db>
</test>

最近需要读取一些文件,展示在网页上面。都是 xml 的数据,使用 Javascript 的 DOMParser 解析这些文件的时候,总是会失败。 debug 了一下发现,是因为这些 xml 的一些内容,比如上面的“1 & 2”里面含有 & 这个符号。只要有这个符号,读取就会失败。DOMParser 不能识别或者智能解析这个&符号么?

大家有没有比较好的办法? xml 数据源这个没有办法,是客户数据。我们只能想办法读取出来。

2043 次点击
所在节点    JavaScript
14 条回复
chendy
2022-02-15 09:30:48 +08:00
nitmali
2022-02-15 09:31:19 +08:00
转义:&amp;
vanton
2022-02-15 09:43:49 +08:00
这是用户错误,xml 语法不规范。
对方开发人员有点偷懒。

解析之前自己先 replace 。
littleylv
2022-02-15 09:44:31 +08:00
本身 xml 就不应该包含 “&”、“<”,“>” 等特殊符号,生成 xml 字符串的写入 xml 文件的时候就应该转义掉。

所以这里不是 DOMParser 的问题,是你自己 strXml 的问题。

此贴终结。
yazoox
2022-02-15 09:45:12 +08:00
@nitmali
@chendy

这么简单粗暴么?没有“温柔”一点的?
ospider
2022-02-15 09:51:07 +08:00
如楼上所说,本来就是对方开发人员的烂摊子,你还要啥优雅方法……快糙猛弄完就得了。
jpyl0423
2022-02-15 09:51:24 +08:00
直接用 html 方式读取不就好了吗
chendy
2022-02-15 09:51:38 +08:00
@yazoox 没,因为数据本身就错了,于是用之前要先修复数据,修理的方法就是自己做转义……
cweijan
2022-02-15 10:00:40 +08:00
在 idea 试了下, &的符号确实是非法的.. 你试下其他解析库支不支持, https://www.npmjs.com/search?q=xml
nieyujiang
2022-02-15 10:12:38 +08:00
这还要什么优雅,只有魔法才能打败魔法
sprite82
2022-02-15 11:46:40 +08:00
对方要么转义,要么 cdata 包起来,否则,只能是你来暴力替换处理
BrettD
2022-02-15 12:44:31 +08:00
XML 含有&本来就不合规范。让客户改去。
netnr
2022-02-15 12:53:08 +08:00
根据 fast-xml-parser 打包的浏览器版本,https://ss.js.org/jsontoxml
ragnaroks
2022-02-15 20:11:37 +08:00
XML 的标准是内容需要 [CDATA][/CDATA]

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/833899

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX