如何合并linq中的列中的数据

时间:2011-02-02 12:42:19

标签: xml linq merge

我有xml格式的源数据,如;

    <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实现此目的?

提前致谢。

2 个答案:

答案 0 :(得分:0)

取决于语言。在C#中,这看起来像Zip()或类似的工作。但是你必须首先从XML中获取数据。

答案 1 :(得分: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