2011-02-02 11 views
1

我有一個xml格式的源數據,比如;如何在linq中合併列中的數據

<plans> 
    <plan> 
     <id>1</id> 
     <name>Test1</name> 
     <description>Description for test 1</description> 
    </plan> 
    <plan> 
     <id>2</id> 
     <name>Test2</name> 
     <description>Description for test 2</description> 
    </plan> 
    <plan> 
     <id>3</id> 
     <name>Test3</name> 
     <description>Description for test 3</description> 
    </plan> 
    </plans> 

而且我有一些細節數據,這些數據也是xml格式,比如:

<plandetails> 
    <detail> 
     <planid>1</planid> 
     <properties> 
      <propery> 
       <name>Pname1</name> 
       <value>Test1Property1</value> 
       <name>Pname2</name> 
       <value>Test1Property2</value> 
       <name>Pname3</name> 
       <value>Test1Property3</value> 
      </propery> 
     </properties> 
    </detail> 
    <detail> 
     <planid>2</planid> 
     <properties> 
      <propery> 
       <name>Pname1</name> 
       <value>Test2Property1</value> 
       <name>Pname2</name> 
       <value>Test2Property2</value> 
       <name>Pname3</name> 
       <value>Test2Property3</value> 
      </propery> 
     </properties> 
    </detail> 
    <detail> 
     <planid>3</planid> 
     <properties> 
      <propery> 
       <name>Pname1</name> 
       <value>Test3Property1</value> 
       <name>Pname2</name> 
       <value>Test3Property2</value> 
       <name>Pname3</name> 
       <value>Test3Property3</value> 
      </propery> 
     </properties> 
    </detail> 
</plandetails> 

我想獲得像這樣的結果;

Name   Test1     Test2     Test3     .... Test n 
Description Description for test 1 Description for test 2 Description for test 3 .... Description for test n 
Pname1  Test1Property1   Test2Property1   Test3Property1   .... TestnProperty1 
Pname2  Test1Property2   Test2Property2   Test3Property2   .... TestnProperty2 
Pname3  Test1Property3   Test2Property3   Test3Property3   .... TestnProperty3 
. 
. 
. 
. 

如何用LINQ實現這一目標?

在此先感謝。

+0

好像你正在尋找的東西就像一個支點? – 2011-02-02 14:03:17

回答

0

取決於語言。在C#中,這看起來像是Zip()或類似的工作。但是你必須先從XML中獲取數據。

0

我將數據合併到一個可管理的結構中,但您需要格式化輸出。

這裏真的沒有什麼特別的。我只是使用linq加入plan.id == detail.planid並將結果固定在一個匿名對象中。

var xmaster = XElement.Parse(
    @"<plans> 
    <plan> 
     <id>1</id> 
     <name>Test1</name> 
     <description>Description for test 1</description> 
    </plan> 
    <plan> 
     <id>2</id> 
     <name>Test2</name> 
     <description>Description for test 2</description> 
    </plan> 
    <plan> 
     <id>3</id> 
     <name>Test3</name> 
     <description>Description for test 3</description> 
    </plan> 
    </plans>"); 

var xdetail = XElement.Parse(
    @"<plandetails> 
     <detail> 
      <planid>1</planid> 
      <properties> 
       <propery> 
        <name>Pname1</name> 
        <value>Test1Property1</value> 
        <name>Pname2</name> 
        <value>Test1Property2</value> 
        <name>Pname3</name> 
        <value>Test1Property3</value> 
       </propery> 
      </properties> 
     </detail> 
     <detail> 
      <planid>2</planid> 
      <properties> 
       <propery> 
        <name>Pname1</name> 
        <value>Test2Property1</value> 
        <name>Pname2</name> 
        <value>Test2Property2</value> 
        <name>Pname3</name> 
        <value>Test2Property3</value> 
       </propery> 
      </properties> 
     </detail> 
     <detail> 
      <planid>3</planid> 
      <properties> 
       <propery> 
        <name>Pname1</name> 
        <value>Test3Property1</value> 
        <name>Pname2</name> 
        <value>Test3Property2</value> 
        <name>Pname3</name> 
        <value>Test3Property3</value> 
       </propery> 
      </properties> 
     </detail> 
    </plandetails>"); 

var merged = from m in xmaster.Descendants("plan") 
      join d in xdetail.Descendants("detail") 
       on (int)m.Element("id") equals (int)d.Element("planid") 
      select new 
      { 
       Name = m.Element("name").Value, 
       Description = m.Element("description").Value, 
       Pnames = d.Descendants("propery").Elements().Where(n => n.Name == "value").Select(v => v.Value) 
      }; 

enter image description here

+0

謝謝philip,但是轉向你的結果就是我正在尋找的東西。我們如何轉動它? – bsaglamtimur 2011-02-02 19:13:18