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

