2012-12-03 75 views
1

這裏是我創建的XML文件XML輸出包含重複的值,使用C#的LINQ to XML創建後

public void CreateXml(string[] names, string[] values, string type) 
{ 
     XElement xml = new XElement("Transaction", 
      new XElement("TransactionType", type)); 
     foreach (var i in names) 
     { 
      foreach (var o in values) 
      { 
       xml.Add(new XElement(i.Replace(" ", string.Empty), o)); 
      } 
     } 
     xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml"); 
} 

代碼和我的輸出看起來像這樣

<?xml version="1.0" encoding="UTF-8"?> 
<Transaction> 
    <TransactionType>Void</TransactionType> 
    <Zip>1</Zip> 
    <Zip>2</Zip> 
    <PNRef>1</PNRef> 
    <PNRef>2</PNRef> 
</Transaction> 

但是這是不對的,我期待更多這樣的

<?xml version="1.0" encoding="UTF-8"?> 
<Transaction> 
    <TransactionType>Void</TransactionType> 
    <Zip>1</Zip> 
    <PNRef>2</PNRef> 
</Transaction> 

正如我已經注意到的值是正確的,但它只是我重複,我怎麼能科幻x這個?

string[] textBoxNamesArray = flowLayoutPanelText.Controls.OfType<TextBox>() 
            .Select(r => r.Name) 
            .ToArray(); 

string[] textBoxTextsArray = flowLayoutPanelText.Controls.OfType<TextBox>() 
            .Select(r => r.Text) 
            .ToArray(); 
+1

你的問題在於這裏。 foreach(var i的名字) foreach(var o值) { YOu可能希望將它們作爲字典類型對象或對象集合發送。然後在字典或集合上做一個循環。 – ryadavilli

+0

@ryadavilli,如何做到這一點?謝謝! – GrayFullBuster

+1

dasblinkenlight給出了很好的解釋和下面的工作。我已經給出了一個關於如何在我的答案中使用下面的字典的簡單說明。 – ryadavilli

回答

4

你不應該用那麼兩個嵌套的循環:兩個嵌套循環創建一個笛卡爾積(即每個名稱都與每個值配對)。

如果您使用一個循環同時通過名稱和值,您將得到您的預期輸出。

如果您使用的是.NET 4,你可以使用Zip方法,像這樣:

xml.Add(
    names 
    .Zip(values, (n,v) => new XElement(n.Name(" ", string.Empty), v)) 
    .ToArray() 
); 
+0

n,v這些是數組? – GrayFullBuster

+1

@GrayFullBuster不,這些是lambda的參數 - 「Zip」方法的第二個參數。它描述瞭如何將名稱和值配對成一個臨時對象,在下一步中使用它來構造'XElement'。 **編輯**順便說一句,我簡化了一些更多的表達式來刪除「選擇」和使用匿名類。 – dasblinkenlight

3

很難說沒有知道你如何組織你的2個陣列中的數據,但我猜:

for (int i = 0; i < names.Length; i++) 
    { 
     xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i])); 
    } 
+0

關於這兩個數組的確實的事情是,他們將永遠具有相同的長度:) – GrayFullBuster

+2

是的,但問題是,這並不明顯,只有你知道;-)。最好只有1個對象集合,每個對象都有2個屬性。 –

+1

@GrayFullBuster如果您確定數組的長度和值,我已經在我的答案中給出瞭解決方法。但這仍然不是一個很好的做事方式。 – ryadavilli

2

試試這個使用字典。

public void CreateXml(Dictionary<string, string> myNameValuePairs, string type) 
{ 
    XElement xml = new XElement("Transaction", 
     new XElement("TransactionType", type)); 
    foreach (var key in names) 
    { 
     xml.Add(new XElement(key.Replace(" ", string.Empty), myNameValuePairs[key])); 
    } 
    xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml"); 
} 

編輯:使用上述方法簽名的解決方法。但是,如果只有值[i]是名稱[i]的對應值,這纔有效。除非您確定數組的長度和名稱和值的大小,否則我不會提供這方面的建議。

public void CreateXml(string[] names, string[] values, string type) 
{ 
    XElement xml = new XElement("Transaction", 
     new XElement("TransactionType", type)); 
    foreach (var i = 0; i < names.length; i++) 
    { 
     xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i])); 
    } 
    xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml"); 
} 
+0

我正在嘗試使用字典thingy。我很困惑,我應該在哪裏放置這兩個數組:) – GrayFullBuster

+1

那麼,你正在創建你的名字和值數組的地方,我相信你正在做名字[i] ='某個名字'和值[i] ='一些價值'。相反,在那裏創建你的字典對象並做一個dictObject。添加('某個名字','某個值');然後將整個dictObject傳遞給你的方法。 – ryadavilli

+0

@ryadivilli,我把代碼如何傳遞給數組的值 – GrayFullBuster