XmlReader跳过一些块

时间:2012-07-19 09:53:24

标签: c# .net xmlreader code-inspection

我有一个像这样的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 个答案:

答案 0 :(得分: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;
    }
}

理论上,这样做的比较少,但可能是无关紧要的差异。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你有类型吗? 如果statement是“Timeseries”,但while语句是“Period”

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

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

答案 3 :(得分:0)

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