V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
WangLiCha
V2EX  ›  程序员

求助一个需要替换 XML 特定节点的问题,使用 Javascript

  •  
  •   WangLiCha · 2022-07-19 16:37:51 +08:00 · 1132 次点击
    这是一个创建于 890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前的工作需要转换一些 XML 的结构,具体来说的话是这样:

    这是转换前的结构,<hrow>节点下固定有两个子节点,第一个子节点固定是<hi>,节点的值是 A ,第二个节点固定是<htag>,<htag>也固定有两个子节点,不过节点类型没有限制,这两个节点的值是 B 和 C 。准确的来说这个需要转换的结构的判定标准是“<hrow>节点下的第 2 个子节点是<htag>”

    <hrow>
      <hi>A</hi>
      <htag>
        <hi>B</hi>
        <hi>C</hi>
      </htag>
    </hrow>
    

    这是转换后前的结构,<hrow>节点下还是固定有两个子节点,第一个子节点替换为固定<hsub>,节点的值是 A 和 B ,第二个替换为固定<hi>,节点的值是 C

    <hrow>
      <hsub>
        <hi>A</hi>
        <hi>B</hi>
      </hsub>
      <hi>C</hi>
    </hrow>
    

    这样的结构会在 XML 中出现(而不是一整个完整的 XML ),需要找到 XML 中对应的结构并替换。此外也有可能出现嵌套结构的情况,比如这样:

    <hrow>
      <hi>A</hi>
      <htag>
        <hrow>
          <hi>B</hi>
          <htag>
            <hi>C</hi>
            <hi>D</hi>
          </htag>
        </hrow>
        <hi>E</hi>
      </htag>
    </hrow>
    

    这个结构按照规则转换过来是这样:

    <hrow>
      <hsub>
        <hi>A</hi>
        <hrow>
          <hsub>
            <hi>B</hi>
            <hi>C</hi>
          </hsub>
          <hi>D</hi>
        </hrow>
      </hsub>
      <hi>E</hi>
    </hrow>
    

    感觉这是个涉及到数据结构的问题,不过因为没有实际学过所以做起来有点棘手。之前也试过用正则表达式,但是应该不够用,也了解过 XSLT ,似乎也不太能很好的解决问题,目前看来是真的只能用 DOMParser 读取 XML 然后操作树了?这个就真的没什么思路了,求 V 友们指点一下

    3 条回复    2022-07-19 21:10:51 +08:00
    viakiba
        1
    viakiba  
       2022-07-19 18:40:25 +08:00
    js 里 也有 xpath ,应该能组合出你的需求
    fnmain
        2
    fnmain  
       2022-07-19 18:45:13 +08:00
    duan602728596
        3
    duan602728596  
       2022-07-19 21:10:51 +08:00
    DOMParser 现成的解析器为啥就不能用了?你这个本来就是要操作树啊,换哪个解析器都是这个操作啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1186 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:14 · PVG 02:14 · LAX 10:14 · JFK 13:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.