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

如何在C#中向XML元素的文本值中间插入子元素?

在XML元素的文本中间插入子元素的解决方案

事后修改已生成的XML文件

你之前的两种方法存在的问题:

  • 直接拼接XML字符串:XML解析器会自动转义<、>等特殊字符,导致插入的内容变成纯文本而非元素。
  • 直接添加元素到目标节点:原节点只有一个文本子节点,新元素会被追加到子节点列表末尾,无法插入到文本中间。

正确的做法是将原文本拆分为多段,然后依次添加文本节点和目标元素到目标节点中,以下是两种常见实现:

使用XDocument(LINQ to XML)

// 加载目标XML文件
var doc = XDocument.Load("target.xml");
// 获取Child1元素
var child1 = doc.Root.Element("Child1");

if (child1 != null)
{
    // 获取原文本内容并拆分(这里按"_Test_"拆分,可根据实际需求调整拆分逻辑)
    var originalText = child1.Value;
    var textParts = originalText.Split(new[] {"_Test_"}, StringSplitOptions.None);
    
    // 清空Child1的现有节点
    child1.RemoveNodes();
    
    // 依次添加文本节点、插入元素、剩余文本节点
    child1.Add(new XText(textParts[0] + "_"));
    child1.Add(new XElement("InsertElement", "Test"));
    child1.Add(new XText("_" + textParts[1]));
    
    // 保存修改后的XML
    doc.Save("target.xml");
}

使用XmlDocument

XmlDocument doc = new XmlDocument();
doc.Load("target.xml");
XmlNode child1Node = doc.SelectSingleNode("/Root/Child1");

if (child1Node != null)
{
    string originalText = child1Node.InnerText;
    string[] textParts = originalText.Split(new[] {"_Test_"}, StringSplitOptions.None);
    
    // 清空节点原有内容
    child1Node.RemoveAll();
    
    // 添加第一段文本
    child1Node.AppendChild(doc.CreateTextNode(textParts[0] + "_"));
    
    // 创建并添加插入元素
    XmlElement insertElem = doc.CreateElement("InsertElement");
    insertElem.InnerText = "Test";
    child1Node.AppendChild(insertElem);
    
    // 添加最后一段文本
    child1Node.AppendChild(doc.CreateTextNode("_" + textParts[1]));
    
    doc.Save("target.xml");
}

生成XML时直接构造混合内容

如果不需要事后修改,而是在通过XmlSerializer生成XML时就构造混合内容,可以通过在实体类中结合[XmlText]和[XmlElement]特性实现:

定义实体类

public class Root
{
    public Child1 Child1 { get; set; }
}

public class Child1
{
    // 标记文本片段,支持多个文本节点
    [XmlText]
    public string[] TextSegments { get; set; }

    // 标记需要插入的元素
    [XmlElement("InsertElement")]
    public string InsertedContent { get; set; }
}

序列化生成XML

var root = new Root
{
    Child1 = new Child1
    {
        TextSegments = new[] {"Test_", "_Test"},
        InsertedContent = "Test"
    }
};

XmlSerializer serializer = new XmlSerializer(typeof(Root));
using (StreamWriter writer = new StreamWriter("output.xml"))
{
    serializer.Serialize(writer, root);
}

执行后生成的XML结构即为你期望的样式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:25:26