请帮助制作基于列表项(相同级别)的嵌套列表,但具有不同的标签文本,这将开始每个列表项的文本。我已经完成了一些正则表达式替换以满足嵌套。我假设我的代码不符合分组|嵌套的要求。请提出建议。
IN.xnl:
<article> <p>The Simple list sample</p> <list-item>1. First</list-item> <list-item>2. Second</list-item> <list-item>3. Third</list-item> <p>The Nested list sample</p> <list-item>1. FirstLevel First Text</list-item> <list-item>1.1 SecondLevel First Text</list-item> <list-item>1.1.1 ThirdLevel First Text</list-item> <list-item>1.1.2 ThirdLevel Second Text</list-item> <list-item>1.2 SecondLevel Second Text</list-item> <list-item>2. FirstLevel Second Text</list-item> <list-item>2.1 SecondLevel First Text</list-item> <list-item>2.2 SecondLevel Second Text</list-item> <list-item>3. FirstLevel Third Text</list-item> <list-item>4. FirstLevel Fourth Text</list-item> </article>
C#(试用代码):
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
using System.Linq;
using System.Linq.Expressions;
namespace ListNesting1
{
class Program
{
static void Main(string[] args)
{
XmlDocument XMLDoc1 = new XmlDocument();
XmlNodeList NDL1, NDL2, NDL3, NDL4, NDL5, NDL6, NDL7;
XmlElement XEle1;
String S1, S2, S3 = "", S4, StrFinal, StrEle1;
StreamReader SR1;
StreamWriter SW1;
try
{
SR1 = new StreamReader(args[0]);
S1 = SR1.ReadToEnd();
SR1.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return;
}
XMLDoc1.LoadXml(S1);
NDL1 = XMLDoc1.SelectNodes("//list-item");
for(int i=0; i<NDL1.Count; i++)
{
if (Regex.IsMatch(NDL1[i].InnerText, @"^[0-9]\. "))
{
StrEle1 = "List1";
}
else if (Regex.IsMatch(NDL1[i].InnerText, @"^[0-9]\.[0-9] "))
{
StrEle1 = "List2";
}
else if (Regex.IsMatch(NDL1[i].InnerText, @"^[0-9]\.[0-9]\.[0-9] "))
{
StrEle1 = "List3";
}
else
{
StrEle1 = "List4";
}
XEle1 = XMLDoc1.CreateElement(StrEle1);
S2 = NDL1[i].OuterXml;
XEle1.InnerXml = S2;
NDL1[i].ParentNode.InsertAfter(XEle1, NDL1[i]);
NDL1[i].ParentNode.RemoveChild(NDL1[i]);
}
StrFinal = XMLDoc1.OuterXml;
StrFinal = StrFinal.Replace("</List1><List1>", "");
StrFinal = StrFinal.Replace("</List2><List2>", "");
StrFinal = StrFinal.Replace("</List3><List3>", "");
StrFinal = StrFinal.Replace("</List4><List4>", "");
StrFinal = StrFinal.Replace("</list-item></List1><List2>", "<List2>");
StrFinal = StrFinal.Replace("</list-item></List2><List3>", "<List3>");
StrFinal = StrFinal.Replace("</list-item></List3><List4>", "<List4>");
StrFinal = StrFinal.Replace("</List2><List1>", "</List2></list-item>");
StrFinal = StrFinal.Replace("</List3><List2>", "</List3></list-item>");
StrFinal = StrFinal.Replace("</List4><List3>", "</List4></list-item>");
StrFinal = StrFinal.Replace("><", ">\n<");
SW1 = new StreamWriter(args[1]);
SW1.Write(StrFinal);
SW1.Close();
}
}
}
所需XML:
<article>
<p>The Simple list sample</p>
<List1>
<list-item>1. First</list-item>
<list-item>2. Second</list-item>
<list-item>3. Third</list-item>
</List1>
<p>The Nested list sample</p>
<List1>
<list-item>1. FirstLevel First Text
<List2>
<list-item>1.1 SecondLevel First Text
<List3>
<list-item>1.1.1 ThirdLevel First Text</list-item>
<list-item>1.1.2 ThirdLevel Second Text</list-item>
</List3>
</list-item>
<list-item>1.2 SecondLevel Second Text</list-item>
</List2>
</list-item>
<list-item>2. FirstLevel Second Text
<List2>
<list-item>2.1 SecondLevel First Text</list-item>
<list-item>2.2 SecondLevel Second Text</list-item>
</List2>
</list-item>
<list-item>3. FirstLevel Third Text</list-item>
<list-item>4. FirstLevel Fourth Text</list-item>
</List1>
</article>