1

私は XmlReader を使用して XML ファイルを読み取っていますが、XML 要素を Document 要素のすぐ下に数えたいと思っています。

XML

<?xml version="1.0" encoding="utf-8"?>
<NewsLetters>
  <EMail Date="10/10/2009">hello@hello.com</EMail>
  <EMail Date="10/10/2009">hello@hello.com</EMail>
  <EMail Date="10/10/2009">hello@hello.com</EMail>
  <EMail Date="10/10/2009">hello@hello.com</EMail>
</NewsLetters>

C# コード:

public static string TotalMemberCount()
{
    XmlTextReader reader = new XmlTextReader(HttpContext.Current.Server.MapPath("~/Newsletter/NewsLetter.xml"));

    int totalCount = 0;
    while (reader.Read())
    {
        if (reader.NodeType == XmlNodeType.Element && reader.NodeType != XmlNodeType.Document)
            totalCount++;
    }

    return totalCount.ToString();
}

通常は 4 つのレコードを期待していましたが、ルート要素もカウントするため、5 が返されます。私は何をすべきか ?実際、私は XDocument、XElement、および LINQ を使用して解決する方法を知っていますが、この方法で解決したいのですが、そのような問題を解決できるあらゆる方法を学びたいので、理由を聞かないでください。

前もって感謝します。

心から....

4

2 に答える 2

2

あなたが思いついた答えには、少なくとも 5 つの異なる点で欠陥があります。

  1. コードは XML の情報に完全に依存しているため、これは確かに「一般的な解決策」ではありません。メソッドが処理する XML ドキュメントに、追加した flag 属性が含まれている場合にのみ、メソッドは要素を正しくカウントできます。

  2. flag 属性は不要です。読み取り中のストリームの先頭から開始するときはいつでもXmlReader、最初に読み取る要素が常に最上位の要素になります。それ以外のことはあり得ません。ドキュメントに属性を追加してトップレベルの要素を識別する代わりに、フラグを使用して、トップレベルの要素をまだ読んだかどうかを追跡できます。または、合計から 1 を引くこともできます。

  3. また、フラグ属性必要だったとしても、それは間違っています。あなたはMoveToFirstAttributeそれを見つけるために使用しています。要素に複数の属性がある場合はどうなりますか? コードが見つけた最初の属性の値が でTrueはない場合はどうなるRootでしょうか? また、子要素の 1 つにその値の属性がある場合はどうなるでしょうか。この目的で属性を使用する場合は、少なくとも名前で検索する必要があります。

  4. このコードは、最上位要素のすべての子要素をカウントするのではなく、すべての子孫要素をカウントします。リーダーは、ドキュメントの順序でノードからノードに移動します。要素ノードに子ノードがある場合、その子ノードは によって読み取られる次のノードですRead()XmlReader要素全体とそのすべてのコンテンツを一度に読み取るために使用できるのメソッドがありますが、それらを使用していません。

  5. 条件reader.NodeType != XmlNodeType.XmlDeclaration && reader.NodeType == XmlNodeType.Elementは冗長です。ノードが要素である場合、ノードを XML 宣言にする方法はありません。

于 2009-10-12T07:57:38.443 に答える
0

とにかく、私は自分の解決策を見つけました。私が達成しようとしていたのは、一般的な解決策を見つけることなので、そのような解決策を思いつきました:

XML

<?xml version="1.0" encoding="utf-8"?>
<NewsLetters Root="True">
  <EMail Date="10/10/2009">hello@hello.com</EMail>
  <EMail Date="10/10/2009">hello@hello.com</EMail>
  <EMail Date="10/10/2009">hello@hello.com</EMail>
  <EMail Date="10/10/2009">hello@hello.com</EMail>
</NewsLetters>

C#

   public static string TotalMemberCount()
    {
        int totalCount = 0;
        using (XmlTextReader reader = new XmlTextReader(HttpContext.Current.Server.MapPath("~/Newsletter/NewsLetter.xml")))
        {
            while (reader.Read())
            {
                if (reader.NodeType != XmlNodeType.XmlDeclaration && reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.MoveToFirstAttribute())
                    {
                        if (reader.Value == "True")
                            //gotcha, I don't want this,this is root element
                            continue;
                    }
                    totalCount++;
                }
            }
            return totalCount.ToString();
        }

    }
于 2009-10-12T00:13:58.777 に答える