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
相关产品推荐
相关产品推荐

