Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为列表中列表中的文本值指定唯一编号_C#_Xml_Recursion_Openxml - Fatal编程技术网

C# 为列表中列表中的文本值指定唯一编号

C# 为列表中列表中的文本值指定唯一编号,c#,xml,recursion,openxml,C#,Xml,Recursion,Openxml,我正在C#(vs2005)中从事一个项目,该项目采用XML并创建一个docx文件。(当我说XML时,我指的是格式良好的HTML,我正在用xmlreader阅读它) 在一个场景中,我可能会得到一个列表中的一个列表中的一个列表等。。。我需要能够识别一段文本在哪个列表中(通过给它一个唯一的编号),而不会将其与较低级别的列表或文件后面同一级别的单独列表混淆 下面是我的例程的一个简单示例,实际上不是我的代码。 不要费心优化这段代码 int LoopCounter = 0; int LoopTotal =

我正在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>

列表#1中的文本。
列表#2中的文本。
文本仍在列表#1中。
在解析每个文本项的过程中,如何为文本指定唯一的编号

在解析文本期间计算标识符的原因是,我可以在docx文件中创建一个与正确的编号模式相对应的段落。每个列表基本上都有自己的UUID,为了让文本按正确的顺序编号,我需要在解析文本时计算UUID,告诉它属于哪个列表

如果我需要详细说明更多信息,请随时询问!谢谢你的帮助


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

您需要这样的程序吗:

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;
}
Random rnd=new Random();
列表=新列表();
Stack listStack=新堆栈();
公共图书馆
{
int listNumber=GetUniqueRandomNumber();
//做你的分析工作
// ...
//当发现
listStack.Push(listNumber);
listNumber=GetUniqueRandomNumber();
//每当遇到#文本时
ListIdentifier=listNumber;
//无论何时发现
listNumber=listStack.Pop();
}
public int GetUniqueRandomNumber()
{
int num=0;
while(num==0)
{
num=rnd.Next(15000);
if(list.Contains(num))
num=0;
else list.Add(num);
}
返回num;
}

因此,这是一个堆栈,每当遇到
时,该堆栈将生成一个新的唯一编号,并且该堆栈下的所有文本都可以分配给该唯一编号。无论何时遇到
,它都会弹回到分配给上一个列表的上一个编号。只要
是平衡的,这应该可以工作。

谢谢,但是如果我在解析每个文本节点时使用它,同一列表中的两个文本节点将得到不同的值,不是吗?我需要它们是相同的数字,但与其他列表中文本节点的值不同。不,它需要维护一个已用数字列表并检查该列表。如果列表包含一个已使用的号码,它将找到一个不同的号码。是的,但是如果我在同一列表中使用文本节点调用该号码,则该号码将不同。我希望文本节点在相同的列表中,具有相同的编号。我现在明白了。给我几分钟写一个新的答案!好的,看看我的新答案。