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

如何在C#中获取StackPanel起始与结束标签间的内容

提取父StackPanel标签内的内容

注意:你的原始XAML代码里有个笔误,</Broder>应该改为</Border>,否则XML解析器会报错。

方法一:使用XML解析(推荐)

因为XAML本质是XML的子集,用标准XML解析器能精准处理嵌套标签,避免正则表达式的局限性。以下是C#的实现示例:

using System.Xml;
using System.Text;

string xamlContent = @"<StackPanel x:Name=""stackPanel"">
    <TextBox>Text</TextBox>
    <Button>Content</Button>
    <Border>
        <StackPanel>
           <TextBox>Text</TextBox>
        </StackPanel>
     </Border>
</StackPanel>";

// 创建XML文档与命名空间管理器(处理x:Name的命名空间)
XmlDocument doc = new XmlDocument();
XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable);
nsManager.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml");
doc.LoadXml(xamlContent);

// 定位目标StackPanel节点
XmlNode targetPanel = doc.SelectSingleNode("//StackPanel[@x:Name='stackPanel']", nsManager);

// 拼接子节点内容并保留缩进格式
StringBuilder innerContent = new StringBuilder();
XmlWriterSettings writerSettings = new XmlWriterSettings
{
    Indent = true,
    IndentChars = "    ", // 匹配原代码的缩进风格
    OmitXmlDeclaration = true,
    NewLineChars = Environment.NewLine
};

foreach (XmlNode child in targetPanel.ChildNodes)
{
    if (child.NodeType != XmlNodeType.Whitespace) // 跳过纯空白节点
    {
        using (StringWriter sw = new StringWriter())
        {
            using (XmlWriter writer = XmlWriter.Create(sw, writerSettings))
            {
                child.WriteTo(writer);
            }
            innerContent.AppendLine(sw.ToString().TrimEnd());
        }
    }
}

// 输出结果
Console.WriteLine(innerContent.ToString().TrimEnd());

这段代码会准确提取目标<StackPanel x:Name="stackPanel">内部的所有内容,包括嵌套子标签,同时保留原有的缩进格式。

方法二:正则表达式(仅适用于无嵌套同名标签的简单场景)

正则无法完美处理递归嵌套的XML标签,仅当你的XAML结构简单、没有多层嵌套的<StackPanel>时可以尝试:

using System.Text.RegularExpressions;

string xamlContent = @"<StackPanel x:Name=""stackPanel"">
    <TextBox>Text</TextBox>
    <Button>Content</Button>
    <Border>
        <StackPanel>
           <TextBox>Text</TextBox>
        </StackPanel>
     </Border>
</StackPanel>";

// 匹配起始标签与结束标签间的内容,Singleline模式允许跨行匹配
Regex regex = new Regex(@"<StackPanel x:Name=""stackPanel"">\s*(.*?)\s*</StackPanel>", RegexOptions.Singleline);
Match match = regex.Match(xamlContent);

if (match.Success)
{
    Console.WriteLine(match.Groups[1].Value);
}

注意:如果XAML中存在嵌套的<StackPanel>,该正则会匹配到第一个</StackPanel>就终止,导致结果错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:50:36