javascript - 如果节点包含具有特定名称的子节点但出现错误,则尝试从 XML 中删除该节点

标签 javascript jquery xml

我正在构建一个小型网站来协助修改 Space Engineers Sandbox.sbc 文件,以便更轻松地插入和删除 mod id。

我目前可以插入 ID,但在删除 mod xml 元素时遇到问题。

这是示例代码(插入按钮在我这边有效,但我不确定如何正确导入外部 javascript 格式化插件文件)。

$(document).ready(function() {
  $("#insertmod").click(function() {
    var modID = $("#modID").val(),
      xmlDoc = $.parseXML($("#xmlTree").val()),
      $xml = $(xmlDoc),
      $mods = $xml.find("Mods");

    moditem = "<ModItem><Name>" + modID + ".sbm</Name><PublishedFileId>" + modID + "</PublishedFileId></ModItem>";
    $mods.append(moditem);

    prettyXML = $.format(new XMLSerializer().serializeToString($xml[0]), {
      method: 'xml'
    });
    $("#xmlTree").val(prettyXML);
  });

  $("#removemod").click(function() {
    var modID = $("#modID").val(),
      xmlDoc = $.parseXML($("#xmlTree").val()),
      $xml = $(xmlDoc),
      $mods = $xml.find("Mods");

    $removalNode = $mods.filter("ModItem PublishedFileId:contains(" + modID + ")");
    $mods.remove($removalNode);

    prettyXML = $.format(new XMLSerializer().serializeToString($xml[0]), {
      method: 'xml'
    });
    $("#xmlTree").val(prettyXML);
  });
});
<script src="https://github.com/zachofalltrades/jquery.format/blob/master/jquery.format.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label for="modID">Mod ID
  <input type="text" name="modID" id="modID">
</label>
<br>
<label for="xmlTree">Current Sandbox.sbc XML
  <br>
  <textarea name="xmlTree" id="xmlTree" cols="30" rows="10">
    <Mods>
      <ModItem>
        <Name>302257706.sbm</Name>
        <PublishedFileId>302257706</PublishedFileId>
      </ModItem>
      <ModItem>
        <Name>303127240.sbm</Name>
        <PublishedFileId>303127240</PublishedFileId>
      </ModItem>
      <ModItem>
        <Name>301534203.sbm</Name>
        <PublishedFileId>301534203</PublishedFileId>
      </ModItem>
      <ModItem>
        <Name>300709199.sbm</Name>
        <PublishedFileId>300709199</PublishedFileId>
      </ModItem>
    </Mods>
  </textarea>
</label>
<br>
<button id="insertmod">Insert Mod</button>
<button id="removemod">Remove Mod</button>
<div id="debug"></div>

当我运行我的代码以删除 xml 元素时出现错误

Uncaught TypeError: b.replace is not a function      jquery.min.js:2

所以我什至不确定这里发生了什么,因为显然在我的代码中某处我破坏了 jquery。

我的意图是:找到 mods 元素。接下来过滤它以获取包含子元素的 modItem 元素,该子元素包含与他们提供的用户的 mod ID 匹配的文本。然后删除该元素并将生成的格式化 xml(现在没有删除调制项)显示到文本区域。

最佳答案

您需要 find() 而不是 filter() 来删除 XML 节点。同样,您不能只执行 ModItem PublishedFileId 来获取具有 PublishedFileId 作为子节点的 ModItem。为此使用 :has(...) 。最后,$xml.remove(node) 应该是 $xml.find('somePath').remove();

$(document).ready(function() {
  $("#insertmod").click(function() {
    var modID = $("#modID").val(),
      xmlDoc = $.parseXML($("#xmlTree").val()),
      $xml = $(xmlDoc),
      $mods = $xml.find("Mods");

    moditem = "<ModItem><Name>" + modID + ".sbm</Name><PublishedFileId>" + modID + "</PublishedFileId></ModItem>";
    $mods.append(moditem);

    prettyXML = $.format(new XMLSerializer().serializeToString($xml[0]), {
      method: 'xml'
    });
    $("#xmlTree").val(prettyXML);
  });

  $("#removemod").click(function() {
    var modID = $("#modID").val(),
      xmlDoc = $.parseXML($("#xmlTree").val()),
      $xml = $(xmlDoc),
      $mods = $xml.find("Mods");

    $mods.find("ModItem:has(PublishedFileId:contains('" + modID + "'))").remove();
    prettyXML = $.format(new XMLSerializer().serializeToString($xml[0]), {
      method: 'xml'
    });
    $("#xmlTree").val(prettyXML);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://zachofalltrades.github.io/jquery.format/jquery.format.js"></script>
<label for="modID">Mod ID
  <input type="text" name="modID" id="modID">
</label>
<br>
<label for="xmlTree">Current Sandbox.sbc XML
  <br>
  <textarea name="xmlTree" id="xmlTree" rows="20" style="width:100%">
  <Mods>
    <ModItem>
        <Name>302257706.sbm</Name>
        <PublishedFileId>302257706</PublishedFileId>
    </ModItem>
    <ModItem>
        <Name>303127240.sbm</Name>
        <PublishedFileId>303127240</PublishedFileId>
    </ModItem>
    <ModItem>
        <Name>301534203.sbm</Name>
        <PublishedFileId>301534203</PublishedFileId>
    </ModItem>
    <ModItem>
        <Name>300709199.sbm</Name>
        <PublishedFileId>300709199</PublishedFileId>
    </ModItem>
</Mods>
  </textarea>
</label>
<br>
<button id="insertmod">Insert Mod</button>
<button id="removemod">Remove Mod</button>
<div id="debug"></div>

关于javascript - 如果节点包含具有特定名称的子节点但出现错误,则尝试从 XML 中删除该节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29207662/

相关文章:

javascript - 我可以使用套接字将 JAVA 与 Javascript 通信吗?

javascript - 载入div后执行脚本

javascript - 使用javascript调整文本区域的大小以适应流体宽度布局

javascript - JQuery 删除字符串之前的文本

javascript - 在变量中存储和检索链接的 jquery 效果/对象

javascript - 如何在javascript中上传之前检查文件大小

javascript - 将变量日期与 if/else 语句中的 Date(dateString) 进行比较

c++ - 作为子节点读取的 XML 注释

java - 生成 XML 时如何在 CDATA 中保留换行符?

android - Layout_height 不想在使用 fragment 时逐渐包装内容