110,539
社区成员
发帖
与我相关
我的任务
分享
<ROOT>
<Main1>
<Child1>
<Child1.1>111<</Child1.1>
<Child1.2>222<</Child1.1>
</Child1>
<Child2>
<Child2.1>111<</Child1.1>
<Child2.2>222<</Child1.1>
</Child2>
</Main1>
<Main2>
</Main2>
</ROOT>
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
TextBox textBox = new TextBox() { Multiline = true, Dock = DockStyle.Fill };
textBox.Click += delegate
{
this.Text = GetPath(textBox.Text, textBox.SelectionStart);
};
textBox.Text =
@"<ROOT>
<Main1>
<Child1>
<Child1.1>111</Child1.1>
<Child1.2>222</Child1.1>
</Child1>
<Child2>
<Child2.1>aaa</Child1.1>
<Child2.2>222</Child1.1>
</Child2>
</Main1>
<Main2>
</Main2>
</ROOT>";
this.Controls.Add(textBox);
}
public static string GetPath(string xml, int position)
{
Stack<string> pathStack = new Stack<string>();
Stack<char> textStack = new Stack<char>();
int debt = 0;
bool closePending = false;
for (int i = Math.Min(position, xml.Length - 1); i >= 0; i--)
{
switch (xml[i])
{
case '>':
textStack.Clear();
break;
case '<':
if (closePending)
{
debt++;
}
else
{
if (debt > 0)
{
debt--;
}
else
{
pathStack.Push(new string(textStack.ToArray()));
textStack.Clear();
}
}
break;
default:
textStack.Push(xml[i]);
break;
}
closePending = xml[i] == '/';
}
return string.Join("/", pathStack);
}
}