2016-06-21 50 views
0
<?xml version="1.0" encoding="ISO-8859-1"?> 
<detail id="TestXML"> 
    <styles> 
    <Maininfo id="Set1"> 
     <info1>Test1</info1> 
     <info2>Test2</info2> 
     <info2>Test3</info2> 
     <secondinfo> 
     <secondinfo-base id="1234567"> 
      <description>BlahBlah</description> 
      <quantity>1</quantity> 
     </secondinfo-base> 
     </secondinfo> 
     <colors> 
     <color id="54321"> 
      <color-id>54321</color-id> 
      <name>Test Color</name> 
     </color> 
     </colors> 
    </Maininfo> 
    </styles> 
    <styles> 
    <Maininfo id="Set2"> 
     <info1>Test4</info1> 
     <info2>Test5</info2> 
     <info2>Test6</info2> 
     <secondinfo> 
     <secondinfo-base id="7654321"> 
      <description>BlahBlahandBlah</description> 
      <quantity>2</quantity> 
     </secondinfo-base> 
     </secondinfo> 
     <colors> 
     <color id="12345"> 
      <color-id>12345</color-id> 
      <name>Yellow</name> 
     </color> 
     <color id="23456"> 
      <color-id>23456</color-id> 
      <name>Green</name> 
     </color> 
     <color id="34567"> 
      <color-id>34567</color-id> 
      <name>Red</name> 
     </color> 
     </colors> 
    </Maininfo> 
    </styles> 
</detail> 

我正在嘗試構建一個文件,其中每個顏色ID和名稱都與info1,info2,info3字段組合在一起。例如,我需要設法用這些信息來創建4個不同的組。用C#讀取XML並將信息分組在一起

  • 組1 =集1,測試1,的Test2,Test3的,1234567,54321,測試顏色
  • 組2 =設定2,TEST4,TEST5,TEST6,7654321,12345,黃色
  • 組3 =設置2,TEST4,TEST5,TEST6,7654321,23456,綠
  • 組4 =設置2,TEST4,TEST5,TEST6,7654321,34567,紅

我能得到的顏色和一切,但我似乎不能得到它之前的信息。

這是我正在做的,以獲得顏色和顏色ID。

 var xml = Xdocument.Load("test.xml"); 
     var color = from c in xml.Root.Descendants("color") 
          select new{ 
          colorNumber = (string)c.Element("color-id"), 
          colorName = (string)c.Element("name"), 
          }; 

我已經嘗試了很多不同的方式來獲取將與它配對的信息,但我無法弄清楚。我希望我解釋得很好。

我在這個網站上看了很多相似的東西,但我找不到任何東西。有人可以幫忙嗎?

這個問題很難想象這個問題。對不起,如果它是誤導。

謝謝

回答

0

如果我明白你的需要是否正確,這樣的事情應該適用於你的例子。您可以使用您發現的color元素的Parent屬性來遍歷樹並將其與其他想要的信息配對。

var colorGroups = xml 
    .Descendants("color") 
    .Select(colorElement => 
    { 
     XElement mainInfo = colorElement.Parent.Parent; 

     return new 
     { 
      Set = mainInfo.Attribute("id").Value, 
      Color = colorElement.Element("name").Value, 
      Id = colorElement.Element("color-id").Value, 
      SecondInfo = mainInfo.Element("secondinfo").Elements("secondinfo-base").Select(b => b.Attribute("id").Value).ToList(), 
      Infos = mainInfo.Elements().Where(b => b.Name.LocalName.StartsWith("info")).Select(b => b.Value).ToList() 
     }; 
    }); 

這產生了一個動態類型對象的枚舉。要訪問這些信息,你可以做,例如,

foreach (var colorGroup in colorGroups) 
{ 
    Console.WriteLine(colorGroup.Set); 
} 

因爲他們是動態類型的,你不會有智能影音感在Visual Studio中的屬性名稱,但它仍然編譯和工作運行。我返回動態對象來跟隨你的原始代碼,但你可以在這裏使用一個真正的類(我個人更喜歡這個,事實上,我可能會試圖反序列化整個對象到一組對象,因爲它似乎你使用的大部分無論如何,這些信息會更容易處理,而且更具可讀性,但它遠不止於此)。

+0

這有助於。我沒有意識到我可以做Parent.Parent。因爲這個,我現在有一個版本可以工作。我說的是因爲我遇到了一個具有多個「secondinfo-base」條目的xml文件,我只能得到第一個條目。此外,這可能是一個愚蠢的問題,但你如何訪問你的代碼拉動的信息? – Matt

+0

@Matt,見編輯,這應該處理多個'secondinfo-base'元素。我舉了一個例子,說明如何從結果分組中提取信息。 – steve16351

+0

我明白了。非常感謝。這非常有幫助。 – Matt