0

我有一个这样的xml结构:

Header
  \-Timeseries (1-N)
        \- Period (1-N)
              \- Interval (1-N)

这是一个大概的例子:

<Header>
<Element />
    <Timeseries>
       <Element />
       <Period>
           <Element />
           <Interval>
               <Element />
           </Interval>
       </Period>
    </Timeseries>
</Header>

我希望阅读标题元素,直到我点击 Timeseries,然后是 Timeseries 元素,直到我点击 Period,然后是 Period,直到我点击 Interval,和 Interval,直到我到达 Interval 的末尾。当我完成一个句号时,我正在写所有的间隔。

这个特定的文档有 614 个时间序列,每个时间序列有 1 个周期。

我正在解析它:

while (!xmlReader.EOF)
{
    if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "Header")
    {
        while (xmlReader.Name != "Timeseries" && xmlReader.Read())
        {
            // read
        }
    }
    else if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "Timeseries")
    {
        while (xmlReader.Name != "Period" && xmlReader.Read())
        {
            // read
        }           
    }
    else if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "Period")
    {
        while (xmlReader.Name != "Interval" && xmlReader.Read())
        {
            // read
        }
    }
    else if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "Interval")
    {
        while (xmlReader.NodeType != XmlNodeType.EndElement && xmlReader.Read())
        {
            // read
        }
    }
    else if (xmlReader.NodeType == XmlNodeType.EndElement && xmlReader.Name == "Period")
    {
        // write intervals
    }
    else
    {
        xmlReader.Read();
    }
}

似乎只读取了 166/614 个句点。因此,我必须吞噬一些 xml,但无法发现错误。

转储读取表明时间序列 1-166 已正确解析,但不知何故解析在那之后停止。

4

4 回答 4

1

不确定它是否有帮助,但如果速度是一个问题,也许这会稍微快一点?

while (!xmlReader.EOF)
{
    switch(xmlReader.NodeType)
    {
        case XmlNodeType.Element:
            switch(xmlReader.Name)
            {
                case "Header":
                    while (xmlReader.Name != "Timeseries" && xmlReader.Read()) // advance to next node
                    {
                        // read
                    }
                    break;
                case "Timeseries":
                    while (xmlReader.Name != "Period" && xmlReader.Read()) // advance to next node
                    {
                        // read
                    }  
                    break;
                case "Period":
                    while (xmlReader.Name != "Interval" && xmlReader.Read()) // advance to next node
                    {
                        // read
                    }
                    break;
                case "Interval":
                    while (xmlReader.NodeType != XmlNodeType.EndElement && xmlReader.Read()) // advance to next node
                    {
                        // read
                    }
                    break;
            }
            break;

        case XmlNodeType.EndElement:
            if(xmlReader.Name == "Period")
            {
                // write intervals
            }
            break;

        default:
            xmlReader.Read(); // advance to next node
            break;
    }
}

从理论上讲,这做了一些比较少的比较,但这可能是一个无关紧要的差异。

于 2012-07-19T10:40:20.593 回答
0

那是因为它永远不会到达“else if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "Timeseries")”或第二个“else if (xmlReader.NodeType == XmlNodeType.EndElement && xmlReader.Name == "Period")" 部分代码,因为这些条件被早期的 if 捕获。

于 2012-07-19T10:00:05.180 回答
0

你这里有类型吗?if 语句是“Timeseries”,但 while 语句是“Period”

else if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "Timeseries")
    {
        while (xmlReader.Name != "Period" && xmlReader.Read())
        {
            // read
        }           
    }

你在下面有另一个块做同样的事情。

于 2012-07-19T10:00:50.860 回答
0

显然,我在测试中计算了错误的总时间序列。原始文档也有 166 个时间序列。

于 2012-07-19T10:27:16.387 回答