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 に到達するまでヘッダー要素を読み、次に Period に到達するまで Timeseries 要素を読み、次に Interval に到達するまで Period を読み、さらに Interval の最後に到達するまで Interval を読みたいと思っています。ピリオドが終わったら、すべてのインターバルを書いています。

この特定のドキュメントには、時系列ごとに 1 つの期間を持つ 614 の時系列があります。

私はそれを解析しています:

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")" または 2 番目の "else if (xmlReader.NodeType == XmlNodeType.EndElement && xmlReader.Name == "Period")" これらの条件は以前の ifs によってキャッチされるため、コードの部分。

于 2012-07-19T10:00:05.180 に答える
0

ここにタイプがありますか?If文は「時系列」ですが、while文は「期間」です

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

下に別のブロックがあり、同じことをしています。

于 2012-07-19T10:00:50.860 に答える
0

どうやら、テストで時系列の合計を間違ってカウントしたようです。元のドキュメントにも 166 個の Timeseries があります。

于 2012-07-19T10:27:16.387 に答える