2017-08-03 109 views
0

我在做下面的xml查詢時做錯了什麼?爲節點內的節點解析Xml C#

我試圖在這個xml中打印所有「AppUserModelID」值。 我深入到組,然後試圖循環通過組。有沒有更好的方法來做到這一點比使用長鑽取字符串來獲取組?

<LayoutModificationTemplate Version="1" xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification"> 
     <LayoutOptions StartTileGroupCellWidth="6" /> 
     <DefaultLayoutOverride> 
     <StartLayoutCollection> 
      <defaultlayout:StartLayout GroupCellWidth="6" xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout"> 
      <start:Group Name="Life at a glance" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout"> 
       <start:Tile Size="2x2" Column="0" Row="0" AppUserModelID="microsoft.windowscommunicationsapps_8wekyb3d8bbwe!microsoft.windowslive.calendar" /> 
       <start:Tile Size="4x2" Column="2" Row="0" AppUserModelID="microsoft.windowscommunicationsapps_8wekyb3d8bbwe!microsoft.windowslive.mail" /> 
       <start:Tile Size="2x2" Column="0" Row="2" AppUserModelID="Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge" /> 
       <start:Tile Size="2x2" Column="2" Row="2" AppUserModelID="Microsoft.Windows.Photos_8wekyb3d8bbwe!App" /> 
       <start:Tile Size="2x2" Column="4" Row="2" AppUserModelID="Microsoft.Windows.Cortana_cw5n1h2txyewy!CortanaUI" /> 
       <start:Tile Size="2x2" Column="0" Row="4" AppUserModelID="Microsoft.BingWeather_8wekyb3d8bbwe!App" /> 
       <start:Tile Size="2x2" Column="2" Row="4" AppUserModelID="Microsoft.WindowsPhone_8wekyb3d8bbwe!CompanionApp.App" /> 
       <start:Tile Size="2x2" Column="4" Row="4" AppUserModelID="Microsoft.Office.OneNote_8wekyb3d8bbwe!microsoft.onenoteim" /> 
      </start:Group> 
      <start:Group Name="Play and explore" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout"> 
       <start:Tile Size="4x2" Column="2" Row="2" AppUserModelID="Microsoft.BingNews_8wekyb3d8bbwe!AppexNews" /> 
       <start:Tile Size="2x2" Column="0" Row="4" AppUserModelID="Microsoft.WindowsStore_8wekyb3d8bbwe!App" /> 
       <start:Tile Size="2x2" Column="4" Row="4" AppUserModelID="Microsoft.MicrosoftOfficeHub_8wekyb3d8bbwe!Microsoft.MicrosoftOfficeHub" /> 
      </start:Group> 
      <start:Group Name="" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout"> 
       <start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationID="Microsoft.InternetExplorer.Default" /> 
       <start:DesktopApplicationTile Size="2x2" Column="2" Row="0" DesktopApplicationID="VMware.Horizon.Client" /> 
       <start:DesktopApplicationTile Size="2x2" Column="4" Row="0" DesktopApplicationID="Microsoft.Office.OUTLOOK.EXE.16" /> 
      </start:Group> 
      <start:Group Name="" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout"> 
       <start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationID="C:\Users\jason\Documents" /> 
       <start:DesktopApplicationTile Size="2x2" Column="4" Row="0" DesktopApplicationID="Chrome" /> 
      </start:Group> 
      </defaultlayout:StartLayout> 
     </StartLayoutCollection> 
     </DefaultLayoutOverride> 
    </LayoutModificationTemplate> 

這裏是我的代碼:

XmlDocument doc = new XmlDocument(); 
    doc.Load(@"C:\Users\Nick\Desktop\hi.xml"); 
    //XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); 

    XmlNodeList groups = doc.DocumentElement.SelectNodes("/LayoutModificationTemplate/LayoutOptions/DefaultLayoutOverride/StartLayoutCollection/defaultlayout:StartLayout/start:Group" 
                 //, manager 
                 ); 
    List<String> pinnedProgram = new List<String>(); 

    foreach (XmlNode group in groups) 
    { 
     XmlNodeList titles = doc.DocumentElement.SelectNodes("/start:Tile"); 

     foreach (XmlNode title in titles) 
     { 
      pinnedProgram.Add(title.Attributes["AppUserModelID"].Value); 
     } 

    } 
} 
+0

你有沒有考慮(https://msdn.microsoft.com/en [LINQ到XML?] -us/library/system.xml.linq(v = vs.110).aspx) – Scott

+0

@Scott我的代碼發佈時仍然有問題,它不讓我訪問「AppUserModelID」 – nlstack01

回答

2

使用XML LINQ:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      XElement startLayout = doc.Descendants().Where(x => x.Name.LocalName == "StartLayout").FirstOrDefault(); 

      var results = startLayout.Elements().Where(x => x.Name.LocalName == "Group").Select(x => new { 
       name = (string)x.Attribute("Name"), 
       tiles = x.Elements().Select(y => new { 
        size= (string)y.Attribute("Size"), 
        column = (int)y.Attribute("Column"), 
        row = (int)y.Attribute("Row"), 
        modelId = (string)y.Attribute("AppUserModelID"), 
        appId = (string)y.Attribute("DesktopApplicationID") 
       }).ToList() 
      }).ToList(); 
     } 
    } 
} 
+0

不應該有任何理由除非你正在閱讀wr,否則返回null ong xml文件。確保你沒有得到任何例外。 – jdweng