1

値のみを含むことができるすべてのXML要素を取得すると思われる小さなプログラムを作成しています。たとえば(下の画像を参照してください)、 <Products>これは要素ですが、値を含むことができる他のすべての要素を囲んでいるため、表示されるべきではありません<Description> (強調表示された要素、私の英語は申し訳ありませんが、あなたを願っていますみんなゲット..)

下の画像から、私のプログラムは次の要素のみを選択する必要があります。

<Material_Number> 

<Description> (2つの要素ですが、強調表示された要素は含まれていません)

<Language>  
<Material_Type>  
<Base_Unit> 

私が実際に得るものは何もありません...

ここに画像の説明を入力してください

親切に私のコードを確認し、アドバイスしてください:

public MainForm()
        {
            InitializeComponent();

            XmlDataDocument xmldoc = new XmlDataDocument();
            XmlNode xmlnode;

            FileStream fs = new FileStream(@"C:\text.xml", FileMode.Open, FileAccess.Read);
            xmldoc.Load(fs);

            xmlnode = xmldoc.ChildNodes[1];
            GetElements(xmlnode);                       
        }

        void GetElements(XmlNode inXmlNode)
        {
            XmlNode xNode;
            XmlNodeList nodeList;

            int i = 0;

            if (inXmlNode.HasChildNodes)
            {
                nodeList = inXmlNode.ChildNodes;

                for (i = 0; i <= nodeList.Count - 1; i++)
                {
                    xNode = inXmlNode.ChildNodes[i];
                    string ss = xNode.Name;
                    GetElements(xNode);
                }
            }
            else
            {
                listBox1.Items.Add(inXmlNode.Name); 
            }
        }
4

2 に答える 2

0
  1. 値のみを含むことができるノードについて話しているので、あなたの質問は完全には明確ではありません。基になるスキーマを知らなければ、特定のノードに何を含めることができるか、何を含めることができないかを知ることはできないため、実際には、値のみを含むノードを意味すると想定します
  2. (wlog)<Language>要素のテキスト値はテキストノードです。したがって、これらのノードについてもinXmlNode.HasChildNodes評価します。true子ノードのいずれかにNodeTypeプロパティが設定されているかどうかを確認する必要があります。設定されXmlNodeType.Elementている場合は、その要素をスキップします。

選択した応答は特定の場合にのみ機能することに注意してください。Xmlドキュメントにのようなものが含まれるとすぐに、テキストコンテンツがなくても、要素がリストボックスに表示されます<Language><x/></Language><Language>Xmlドキュメントにが含まれている場合、は<Language><x/><y/><z/></Language>3<Language>回でも結果セットに表示されます。

于 2012-06-06T09:59:39.230 に答える
0

コードを少し短くすることもできますが、最初の要素から開始するように呼び出しを開始する必要があります。

  GetElements(xmldoc.ChildNodes[0]); 
    void GetElements(XmlNode inXmlNode)
    {
        if(inXmlNode.HasChildNodes)
        {
            foreach (XmlNode childNode in inXmlNode.ChildNodes)
            {
                GetElements(childNode);
            }
        }
        else
        {
            listBox1.Items.Add(inXmlNode.ParentNode.Name);
        }
    }
于 2012-06-06T10:16:49.643 に答える