如何在指定位置向现有XML字符串中插入目标XML片段?
问题原因
你之前的实现有两个核心问题:
- 直接用字符串操作XML容错性极低,只要XML内容出现换行、空格、属性、大小写变化,就会匹配失败,而且你原XML还存在根标签前后拼写不一致的问题(开头是
<TRANFSERT>,结尾是</TRANSFERT>),很容易出错。 - 代码逻辑本身错误:
- 你定位的是
</GOOD>的位置,而非目标插入位置</TRANSFERT>的位置 StringBuilder.Append是往字符串末尾追加内容,不是在指定位置插入,插入需要调用Insert方法
- 你定位的是
推荐解决方案:用XML类库操作(避免字符串处理的各类问题)
方案1:使用LINQ to XML(.NET 3.5及以上版本推荐,写法最简洁)
需要先引用System.Xml.Linq命名空间:
// 现有XML内容,注意先修正根标签拼写不一致的问题 string originalXml = "<TRANSFERT><GOOD></GOOD></TRANSFERT>"; XDocument xDoc = XDocument.Parse(originalXml); // 要插入的XML片段如果是字符串可以直接解析 string insertFragment = "<GOOD></GOOD>"; XElement newNode = XElement.Parse(insertFragment); // 插入到根节点的子节点末尾,也就是</TRANSFERT>之前 xDoc.Root.Add(newNode); // 输出最终XML string finalXml = xDoc.ToString();
方案2:使用传统XmlDocument(兼容老版本.NET框架)
需要引用System.Xml命名空间:
string originalXml = "<TRANSFERT><GOOD></GOOD></TRANSFERT>"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(originalXml); // 加载要插入的XML片段 XmlDocumentFragment fragment = xmlDoc.CreateDocumentFragment(); fragment.InnerXml = "<GOOD></GOOD>"; // 插入到根节点下 xmlDoc.DocumentElement.AppendChild(fragment); // 输出最终XML string finalXml = xmlDoc.OuterXml;
字符串操作修正版(不推荐,仅作逻辑参考)
如果坚持要用字符串方式处理,修正后代码如下:
string xmlFinal = "<TRANSFERT><GOOD></GOOD></TRANSFERT>"; string xmlModifiee = "<GOOD></GOOD>"; // 定位</TRANSFERT>的起始位置 int insertPos = xmlFinal.IndexOf("</TRANSFERT>"); if (insertPos >= 0) { StringBuilder sb = new StringBuilder(xmlFinal); // 在目标位置插入内容,而非Append追加 sb.Insert(insertPos, xmlModifiee); xmlFinal = sb.ToString(); }
内容的提问来源于stack exchange,提问作者Berrouayel Farid
相关产品推荐
相关产品推荐

