为列表中列表中的文本值分配唯一编号

时间:2014-05-07 21:38:38

标签: c# xml recursion openxml

我正在研究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,告诉它属于哪个列表。

如果我需要指定更多信息,请随时提出!谢谢你的帮助!

为了澄清,我的想法是让列表中的每个文本节点都分配了一个整数,与同一列表中的所有其他文本节点相同。在任何其他列表中,我不能有相同的号码。我无法改变我的递归程序。

1 个答案:

答案 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>达到平衡,就应该有效。