2012-06-06 27 views
0

我被困在一個需要在具有不同控制文件的兩個程序之間交換數據的項目上。 程序A只是創建一個XML文件,而程序B需要將輸入作爲具有兩個「列」的數組 - 但我怎麼做轉換?轉換數組中的整個Xdocument

例子: 的XML是什麼樣子:

` <Presentation> 
    <Options Name="1"> 
    <Output>MyOutPut</Output> 
    <Slides Name="1"> 
    <Template>Template2</Template> 
     <Diagram Name="Name4"> 
     <More Elements...> 
     </Diagram> 
    </Slides> 
    </Options> 
    </Presentation>` 

輸出應該是這樣的:

` 
    Presentation "" 
    Options 1 
    Output Myoutput 
    Slides 1 
    Template Template2 

... 
` 

但我怎麼能做到這一點?我正在使用vb.net和LINQ,不知道如何解決這個問題。我嘗試了一些LINQ查詢,但我只獲得了個人節點或屬性,所以我認爲嘗試一個不同的想法會更好。 任何意見將不勝感激!

+0

閱讀[預序遍歷](http://en.wikipedia.org/wiki/Tree_traversal#Depth-first_traversal)。 – phg

回答

0

不幸的是,我不能提供VB的代碼,但是我希望這個C#的代碼會有所幫助。

void Main() 
{ 
    var doc = XElement.Load(@"path-to-the-file"); 

    doc.DescendantsAndSelf() 
     .Select(ElementSelector).Dump(); 
} 

private static KeyValuePair<string, string> ElementSelector(XElement e) 
{ 
    var name = e.Name.ToString(); 
    var value = String.Empty; 
    if (e.Descendants().Any()) 
    { 
     if (e.Attributes().Any()) 
     { 
      value = e.Attributes().First().Value; 
     } 
    } 
    else 
    { 
     value = e.Value; 
    } 
    return new KeyValuePair<string, string>(name, value); 
} 
+0

你好RePierre, 你的答案當場釘住了我的問題。 從c#轉換到vb.net很容易,tahnks自動轉換工具。 然而,vb.net不知道傾倒,所以我不得不做了輕微的修改: 「私人小組的Main() 昏暗的DOC = XElement.Load(My.Application.Info.DirectoryPath&Constants.tempXML) 昏暗轉儲= doc.DescendantsAndSelf()。選擇(AddressOf ElementSelector) 昏暗列表= Dump.ToList 對於每個ELEM在列表 Debug.Print(elem.Key&elem.Value) 接着 結束Sub' 你能提供一些關於ElementSelect的信息嗎? –

+0

@ChristianSauer,我已經在** LINQPad **和'Dump()'中測試了代碼,它是一個將結果寫入控制檯的內置方法。 'ElementSelector'是將'XElement'對象轉換爲鍵值對的方法;文檔中的每個元素都由'ElementSelector'方法投影到鍵值對中。 – RePierre