0

複数のXMLファイルに存在する要素の数を見つけるために、小さなXMLツールを作成しました。

このコードは、XMLファイルに含まれている必要のある要素に対して優れた結果をもたらします。

しかし、XMLファイルに存在する場合と存在しない場合がある特定の要素に関しては、ソフトウェアは次のような結果を返します。

10/8/2012 11:27:51 AM
C:\Documents and Settings\AlaspuMK\Desktop\KS\success\4CPK-PMF0-004D-P565-00000-00.xml 
Instance: 0

10/8/2012 11:27:51 AM
C:\Documents and Settings\AlaspuMK\Desktop\KS\success\4CPK-PMF0-004D-P566-00000-00.xml 
Instance: 0

10/8/2012 11:27:51 AM
C:\Documents and Settings\AlaspuMK\Desktop\KS\success\4CPK-PMF0-004D-P567-00000-00.xml 
Instance: 0

10/8/2012 11:27:51 AM
C:\Documents and Settings\AlaspuMK\Desktop\KS\success\4CPK-PMG0-004D-P001-00000-00.xml 
**Instance: 11**

10/8/2012 11:27:51 AM
C:\Documents and Settings\AlaspuMK\Desktop\KS\success\4CPK-PMG0-004D-P002-00000-00.xml 
Instance: 0

ここで問題となるのは、存在するかどうかにかかわらず、ツールがすべてのファイルの結果を表示するタグを検索すると、XMLファイルが500〜1000になる可能性があることです。この場合、特定のタグの現在のインスタンスは0または複数の場合があります。

インスタンスが0より大きいファイル名を見つけるために、コードの変更を提案できますか。インスタンスが0より大きい場合は、テキストボックスに出力してください。

私の現在のコード:

public void SearchMultipleTags()
        {
            if (txtSearchTag.Text != "")
            {
                try
                {
                    //string str = null;
                    //XmlNodeList nodelist;
                    string folderPath = textBox2.Text;
                    DirectoryInfo di = new DirectoryInfo(folderPath);
                    FileInfo[] rgFiles = di.GetFiles("*.xml");
                    foreach (FileInfo fi in rgFiles)
                    {
                        int i = 0;
                        XmlDocument xmldoc = new XmlDocument();
                        xmldoc.Load(fi.FullName);
                        //rtbox2.Text = fi.FullName.ToString();

                        foreach (XmlNode node in xmldoc.GetElementsByTagName(txtSearchTag.Text))
                        {

                            i = i + 1;

                            //
                        }
                        rtbox2.Text += DateTime.Now + "\n" + fi.FullName + " \nInstance: " + i.ToString() + "\n\n";
                        //rtbox2.Text += fi.FullName + "instances: " + str.ToString();
                    }

                }
                catch (Exception ex)
                {

                    MessageBox.Show("Invalid Path or Empty File name field.");


                }
            }
            else
            {
                MessageBox.Show("Dont leave field blanks.");
            }

        }
4

3 に答える 3

0

使用する

if(i > 0)
rtbox2.Text += DateTime.Now + "\n" + fi.FullName + " \nInstance: " + i.ToString() + "\n\n";

単純ではなく

rtbox2.Text += DateTime.Now + "\n" + fi.FullName + " \nInstance: " + i.ToString() + "\n\n";
于 2012-10-08T06:20:19.680 に答える
0

私が正しく理解していれば、iが0より大きい場合にのみテキストを表示したいですか?

if(i > 0 )
rtbox2.Text += DateTime.Now + "\n" + fi.FullName + " \nInstance: " + i.ToString() + "\n\n";
于 2012-10-08T06:20:54.160 に答える
0

tryブロック内でいつでもこのコードを使用できます。

rtbox2.Text =
    String.Join(Environment.NewLine + Environment.NewLine,
        from fi in (new DirectoryInfo(textBox2.Text)).GetFiles("*.xml")
        let xd = XDocument.Load(fi.FullName)
        let i = xd.Descendants(txtSearchTag.Text).Count()
        where i > 0
        select String.Join(Environment.NewLine, new []
        {
            DateTime.Now.ToString(),
            fi.FullName,
            i.ToString(),
        }));

すべてを1行で実行します(フォーマットを禁止します)。:-)

于 2012-10-08T06:38:16.047 に答える