我正在研究C#(vs2005)中的一个项目,该项目采用XML并创建一个docx文件。 (当我说XML时,我的意思是格式良好的HTML,我正在用xmlreader阅读它。)
在一个场景中,我可能会在列表中的列表中给出一个列表等...我需要能够识别哪个列表(通过给它一个唯一的编号)一段文本,而不会混淆它使用较低级别的列表或稍后在文件中的单独列表,在同一级别。
下面是我的例程的一个简单示例,实际上并不是我的代码。 不要为优化此代码而烦恼。
int LoopCounter = 0;
int LoopTotal = 0;
void ParseXmlNode(XmlNode Node)
{
switch (Node.Name)
{
case "ol";
++LoopCounter;
++LoopTotal;
break;
case "#text":
//This is some text within a list.
int ListIdentifier = 0;
//How do I calculate the ListIdentifier?
break;
}
foreach(XmlNode childNode in Node.ChildNodes)
{
ParseXmlNode(childNode);
}
switch (Node.Name)
{
case "ol";
--LoopCounter;
break;
}
}
假设下面给出了我的Xml类型,
<ol>
Text in list #1.
<ol>
Text in list #2.
</ol>
Text still in list #1.
</ol>
在解析每个文本项时,如何为文本指定唯一编号?
在解析文本期间计算标识符的原因是我可以在docx文件中创建一个与正确的编号模式对应的段落。每个列表基本上都会被赋予自己的UUID,为了使文本按正确的顺序编号,我需要在解析文本时计算UUID,告诉它属于哪个列表。
如果我需要指定更多信息,请随时提出!谢谢你的帮助!
为了澄清,我的想法是让列表中的每个文本节点都分配了一个整数,与同一列表中的所有其他文本节点相同。在任何其他列表中,我不能有相同的号码。我无法改变我的递归程序。
答案 0 :(得分:0)
你需要这样的东西:
Random rnd = new Random();
List<int> list = new List<int>();
Stack<int> listStack = new Stack<int>();
public void Main()
{
int listNumber = GetUniqueRandomNumber();
// do your parsing stuff
// ...
// When an <ol> is found
listStack.Push(listNumber);
listNumber = GetUniqueRandomNumber();
// Whenever #text is encountered
ListIdentifier = listNumber;
// Whenever </ol> is found
listNumber = listStack.Pop();
}
public int GetUniqueRandomNumber()
{
int num = 0;
while (num == 0)
{
num = rnd.Next(1, 5000);
if (list.Contains(num))
num = 0;
else list.Add(num);
}
return num;
}
所以这样做的是它有一个堆栈,每次遇到<ol>
时都会生成一个新的唯一编号,并且其下的所有文本都可以分配给该唯一编号。只要遇到</ol>
,它就会弹回到分配给上一个列表的上一个号码。只要<ol>
和</ol>
达到平衡,就应该有效。