You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中如何将XML节点插入到父节点的第二个子节点位置

在Dart中插入XML节点到指定位置(书架的第二本书)

要将新的book节点插入到书架的第二个位置(即第一本书之后,成为第二本书),你需要把原代码中追加节点的add()方法替换为insert()方法,并指定正确的插入索引。原代码的add()会将节点放在最后,而insert()可以指定插入到列表的任意位置。

修改后的完整代码

///dart example/test.dart
import 'package:xml/xml.dart';
import 'dart:io';

const bookshelfXml = '''<?xml version="1.0"?>
    <bookshelf>
      <book>
        <title lang="es">Growing a Language</title>
        <price>29.99</price>
      </book>
      <book>
        <title lang="en">Learning XML</title>
        <price>39.95</price>
      </book>
      <price>132.00</price>
      <book>
        <title lang="en">The War of the Worlds</title>
        <price>12.5</price>
      </book>
    </bookshelf>''';
final document = XmlDocument.parse(bookshelfXml);
void buildBook(XmlBuilder builder, String title, String language, num price) {
  builder.element('book', nest: () {
    builder.element('title', nest: () {
      builder.attribute('lang', language);
      builder.text(title);
    });
    builder.element('price', nest: price);
  });
}

final builder = XmlBuilder();
void main() async {
  buildBook(builder, 'This is the second book in shelf', 'en', 99.99);
  // 修改:使用insert插入到索引2的位置,即第一本书之后
  document.rootElement.children.insert(2, builder.buildFragment());
  const filename = './example/git.xml';
  var wfile = await File(filename).writeAsString(document.toXmlString(pretty: true));
}

关键修改说明

  • 替换document.rootElement.children.add(...)为document.rootElement.children.insert(2, ...):
    原XML的<bookshelf>子节点中,第一个<book>位于索引1的位置,后面跟着空白文本节点(索引2)。插入到索引2的位置后,新的<book>节点会紧跟在第一本书之后,成为结构上的第二本书,原有的后续节点会自动后移。
  • 可选:添加pretty: true到toXmlString(),让输出的XML格式更整洁,便于查看。

如果你的XML结构有变化(比如空白节点数量不同),也可以通过过滤空白节点来精准定位插入位置,示例如下:

// 过滤掉所有空白文本节点,只保留元素节点
final elementChildren = document.rootElement.children.whereType<XmlElement>().toList();
// 找到第一个book节点的位置
final firstBookIndex = document.rootElement.children.indexOf(elementChildren.first);
// 插入到第一个book节点的下一个位置
document.rootElement.children.insert(firstBookIndex + 1, builder.buildFragment());

这种方式更灵活,不受XML缩进格式的影响,适用于动态结构的XML文档。

内容的提问来源于stack exchange,提问作者bangdt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:07:19