我有一个像这样的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,但在此之后解析停止了。
答案 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个时间序列。