2014-11-16 34 views
0

我正在創建應用程序來製作Mod Menu for Modern Warfare 3(XRPC)。我使用XML進行定製,我創建了一個示例XML。XMLNodeList沒有檢索到正確的節點

<MenuFile> 
<Credits> 
    <Author>Callum Carmicheal</Author> 
    <Name>Sample</Name> 
    <Version>0.1</Version> 
</Credits> 

<InfoBar> 
    <Text>Created by ..., Enjoy</Text> 
</InfoBar> 

<Menu> 

    <Main> 
     <Header> 
      <Name>Main Menu</Name> 
     </Header> 

     <Item> 
      <Name>Enable Cheats</Name> 
      <Function> 
       <Menu>Mods</Menu> 
      </Function> 
      <Ignore>false</Ignore> 
     </Item> 

     <Item> 
      <Name> </Name> 
      <Function> </Function> 
      <Ignore>True</Ignore> 
     </Item> 

     <Item> 
      <Name></Name> 
      <Function></Function> 
      <Ignore>True</Ignore> 
     </Item> 

     <Item> 
      <Name></Name> 
      <Function></Function> 
      <Ignore>True</Ignore> 
     </Item> 

     <Item> 
      <Name></Name> 
      <Function></Function> 
      <Ignore>True</Ignore> 
     </Item> 

     <Item> 
      <Name></Name> 
      <Function></Function> 
      <Ignore>True</Ignore> 
     </Item> 

     <Item> 
      <Name></Name> 
      <Function></Function> 
      <Ignore>True</Ignore> 
     </Item> 
    </Main> 

    <Mods> 
     <Header> 
      <Name>Mods</Name> 
     </Header> 

     <Item> 
      <Name>Enable Cheats</Name> 
      <Function> 
       <Dvar>sv_cheats 1</Dvar> 
      </Function> 
      <Ignore>false</Ignore> 
     </Item> 

     <Item> 
      <Name></Name> 
      <Function></Function> 
      <Ignore>True</Ignore> 
     </Item> 

     <Item> 
      <Name></Name> 
      <Function></Function> 
      <Ignore>True</Ignore> 
     </Item> 

     <Item> 
      <Name></Name> 
      <Function></Function> 
      <Ignore>True</Ignore> 
     </Item> 

     <Item> 
      <Name></Name> 
      <Function></Function> 
      <Ignore>True</Ignore> 
     </Item> 

     <Item> 
      <Name></Name> 
      <Function></Function> 
      <Ignore>True</Ignore> 
     </Item> 
    </Mods> 

</Menu> 

</MenuFile> 

這是菜單的,我已經創造了一些C#代碼

 private void button1_Click(object sender, EventArgs e) { 
     XmlDocument xml = new XmlDocument(); 
     xml.LoadXml(System.IO.File.ReadAllText("menu.xml")); // suppose that myXmlString contains "<Names>...</Names>" 

     XmlNode credits_author = xml.SelectSingleNode("/MenuFile/Credits/Author"); 
     XmlNode credits_name = xml.SelectSingleNode("/MenuFile/Credits/Name"); 
     XmlNode credits_version = xml.SelectSingleNode("/MenuFile/Credits/Version"); 
     Log("Credits(Author): " + credits_author.InnerText); 
     Log("Credits(Name): " + credits_name.InnerText); 
     Log("Credits(Version): " + credits_version.InnerText); 

     XmlNode InfoBar = xml.SelectSingleNode("/MenuFile/InfoBar/Text"); 
     Log(""); 
     Log("InfoBar Text: " + InfoBar.InnerText); 

     Log(""); 
     Log("Menus"); 

     XmlNodeList Menus = xml.SelectNodes("/MenuFile/Menu"); 
     // This returns 
     // /MenuFile/Menu not /MenuFile/Menu/MainMenu.... 
     // it should loop through MainMenu, Mods... 
     foreach (XmlNode MenuItem in Menus) { 
      Log("\t Menu: " + MenuItem.Name); // Main should me MainMenu or Mods 

      XmlNodeList Items = xml.SelectNodes("/MenuFile/Menu/" + MenuItem.Name); 
      foreach (XmlNode mi in Items) { 
       if (mi.Name == "Header") { 
        string xpath = FindXPath(mi); 
        string Header = xml.SelectSingleNode("/MenuFile/Menu/" + MenuItem.Name + "/Header/Name").InnerText; 
        Log("\t\t Header: " + Header); 
       } 
       else if (mi.Name == "Item") { 
        string Name = ""; 
        string ignore = ""; 
       } 
      } 

     } 

    } 

但問題是試圖檢索菜單列表/菜單的子節點時,返回菜單列表/菜單本身我的標記沒有線索。 我試過調試,但結果是一樣的,任何人都可以在這看到我的錯誤?

回答

1

你的問題是,你是通過菜單節點,而不是主要或MODS的節點循環:

XmlNodeList Menus = xml.SelectNodes("/MenuFile/Menu"); 
foreach (XmlNode MenuItem in Menus) { 

總是返回外菜單節點。

要提取主/ MODS的節點使用下面的:

XmlNodeList menus = xml.SelectNodes("/MenuFile/Menu/*"); 
foreach (XmlNode menuItem in menus) { 

另外,而只是取「標頭」和「物品」的節點,而不是直接執行不必要「如果」:

XmlNode headerItem = menuItem.SelectSingleNode("Header"); 
... 
XmlNodeList items = menuItem.SelectNodes("Item"); 
foreach (XmlNode item in items) { 
    ...