2

これは私のスクリプトですが、コンソールにスペースしか表示されません。xPathを使用してXMLファイルから属性値を取得する方法を誰かが説明できますか?

    XPathNavigator nav;
    XPathDocument docNav;
    XPathNodeIterator NodeIter;
    XmlNamespaceManager ns;

    Int32 elementCount;

    String windowName;

    private void Form1_Load(object sender, EventArgs e)
    {
        docNav = new XPathDocument("C:/BlueEyeMacro/DaMaGeX/Applications/WindowBuilder/GUI.xml");
        nav = docNav.CreateNavigator();
        ns = new XmlNamespaceManager(nav.NameTable); 
        elementCount = nav.Select("/GUI/window").Count;
        Console.WriteLine(elementCount);
        for (int i = 1; i <= elementCount; i++)
        {
            NodeIter = nav.Select("/GUI/window[@ID="+i+"]");
            windowName = NodeIter.Current.GetAttribute("name", ns.DefaultNamespace);
            Console.WriteLine("{0}", windowName);
        }
    }
}

XML ファイル
<GUI>
<window ID="1" name="mainWindow" parent="0" type="0" text="My first window" options="Option 1;" actions="action 1;" exit="exit;" />
<window ID="2" name="secondWindow" parent="0" type="0" text="My second window" options="Option 1;" actions="action 1;" exit="exit;" />
<window ID="3" name="thirdWindow" parent="0" type="0" text="My third window" options="Option 1;" actions="action 1;" exit="exit;" />
</GUI>

4

3 に答える 3

3

このコードのように、最初にNodeIter.MoveNext()を呼び出す必要があると思います。

XPathNodeIterator nodesText = nodesNavigator.SelectDescendants(XPathNodeType.Text, false);

while (nodesText.MoveNext())
{
    Console.Write(nodesText.Current.Name);
    Console.WriteLine(nodesText.Current.Value);
}
于 2012-05-04T23:06:27.647 に答える
1

属性の文字列値を直接取得できます。

    for (int i = 1; i <= elementCount; i++) 
    { 
     // This obtains the value of the @name attribute directly
     string val = 
               nav.Evaluate("string(/GUI/window[@ID='"+i+"']/@name)") as string;                
     Console.WriteLine(val); 
    }
于 2012-05-05T05:16:23.170 に答える
0

これを行うためにコードを変更することもできます。

    for (int i = 1; i <= elementCount; i++) 
    { 
        var NodeIter = nav.SelectSingleNode("/GUI/window[@ID='"+i+"']/@name"); //This selects the @name attribute directly
        Console.WriteLine("{0}", NodeIter.Value); 
    }

一意の ID でノードを識別している場合、SelectSingleNode は、実行しようとしていることに適しています。

于 2012-05-04T23:11:33.970 に答える