2013-10-25 42 views
0

我從www.openstreetmap.org下載了一些XML數據。我現在希望爲這個應用程序創建一個數據轉換器。我已經做了大量的研究,並且使用位於XDocument類中的Load方法有一些工作原型。XML> LINQ查詢>樹視圖

目前代碼:

// Load the XML document 
var xmlDocument = XDocument.Load(@"C:\demo.xml"); 

// Query the data and write out a subset of contacts 
var xmlDocumentQuery = from c in xmlDocument.Root.Descendants("way") 
         select c.Element("tag").Attribute("k"); 

int indexVariable = 1; 
foreach (string name in xmlDocumentQuery) 
{ 
    Console.WriteLine(indexVariable + " " + name); 
    indexVariable = indexVariable + 1; 
} 

示例XML數據:

<OSM> 
<way id="123610420" visible="true" version="1" changeset="8864750" timestamp="2011-07-29T16:26:39Z" user="BillHall" uid="13013"> 
    <nd ref="1377763151"/> 
    <nd ref="1377763152"/> 
    <nd ref="1377763156"/> 
    <nd ref="1377763165"/> 
    <nd ref="1377763192"/> 
    <nd ref="1376440397"/> 
    <nd ref="1377763200"/> 
    <nd ref="1377763151"/> 
    <tag k="landuse" v="grass"/> 
</way> 
<way id="123610421" visible="true" version="3" changeset="8890869" timestamp="2011-08-01T13:30:49Z" user="BillHall" uid="13013"> 
    <nd ref="1377763173"/> 
    <nd ref="1377763217"/> 
    <nd ref="1377763170"/> 
    <nd ref="1377763137"/> 
    <nd ref="1378432544"/> 
    <nd ref="1377763154"/> 
    <nd ref="1378432543"/> 
    <nd ref="1377763147"/> 
    <nd ref="1376440420"/> 
    <nd ref="1376440265"/> 
    <nd ref="1378432542"/> 
    <nd ref="1376440320"/> 
    <nd ref="1376440262"/> 
    <nd ref="1377763143"/> 
    <nd ref="1377763195"/> 
    <nd ref="1381760571"/> 
    <nd ref="1381760570"/> 
    <nd ref="1377763219"/> 
    <nd ref="1377763173"/> 
    <tag k="landuse" v="grass"/> 
</way> 
<way id="123610422" visible="true" version="2" changeset="8869626" timestamp="2011-07-30T07:53:36Z" user="BillHall" uid="13013"> 
    <nd ref="1377763145"/> 
    <nd ref="1377763129"/> 
    <nd ref="1377763149"/> 
    <nd ref="1377763204"/> 
    <nd ref="1376440568"/> 
    <nd ref="1376440571"/> 
    <nd ref="1377763153"/> 
    <nd ref="1378432539"/> 
    <nd ref="1377763145"/> 
    <tag k="landuse" v="grass"/> 
</way> 
</OSM> 

然而,我的原型是目前唯一能夠選擇一個給定的元素的單個屬性值。然後循環這些值並輸出它們。我現在想通過保留XML文檔的層次結構並將其轉換爲「樹視圖」來進一步擴展我的原型。

我打算使用TreeNode的類來實現此功能。但我不確定如何維護XML文檔的層次結構。

示例層次:

<WAY ID = 「#」> 
    <ND> 
     <ND REF= 「#」> 
     … 
    </ND> 
    <K = 「#」> 
    <V = 「#」> 
</WAY> 
… 

回答

2

創建TreeView從XML元素是相當容易的,你不需要任何LINQ查詢:

var tree = new TreeView(); 
CreateTreeNodes(xmlDocument.Root.Elements(), tree.Nodes); 


private void CreateTreeNodes(IEnumerable<XElement> elements, 
          TreeNodeCollection treeLevel) 
{ 
    foreach (var element in elements) 
    { 
     //Create nodes for each xml element.. 
     var node = new TreeNode(element.Name.LocalName); 
     //..add them to the current "level" in the TreeView.. 
     treeLevel.Add(node); 

     //..and then create (and add) each node's child nodes: 
     CreateTreeNodes(element.Elements(), node.Nodes); 
    } 
}