Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在linq中合并列中的数据_Xml_Linq_Merge - Fatal编程技术网

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

Xml 如何在linq中合并列中的数据,xml,linq,merge,Xml,Linq,Merge,我有一个xml格式的源数据,比如 <plans> <plan> <id>1</id> <name>Test1</name> <description>Description for test 1</description> </plan> <plan> <id>2<

我有一个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>
    <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>
如何使用LINQ实现这一点


提前感谢。

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

我将数据合并到一个可管理的结构中,但您需要格式化输出

这里真的没有什么特别的。我只是使用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)
            };
var xmaster=XElement.Parse(
@"
1.
测试1
测试1的说明
2.
测试2
测试2的说明
3.
测试3
测试3的说明
");
var xdetail=XElement.Parse(
@"
1.
Pname1
测试1属性1
Pname2
测试1属性2
Pname3
测试1属性3
2.
Pname1
测试2属性1
Pname2
测试2属性2
Pname3
测试2属性3
3.
Pname1
测试3属性1
Pname2
测试3属性2
Pname3
测试3属性3
");
var merged=从xmaster.substands(“计划”)中的m开始
在xdetail.substands(“细节”)中加入d
关于(int)m.Element(“id”)等于(int)d.Element(“planid”)
选择新的
{
名称=m.Element(“名称”).值,
描述=m.元素(“描述”).值,
Pnames=d.subjects(“propery”).Elements()。其中(n=>n.Name==“value”)。选择(v=>v.value)
};

似乎您正在寻找类似于枢轴的东西?谢谢philip,但我正在寻找的是旋转您的结果。我们如何使它旋转?我已经成功地使用了这种扩展方法。试试看。我明天会回头看看你是否收到了,或者是否有其他人回答了。明天我会有更多的时间帮忙我花了大约1/2个小时试图获得您想要的输出,但无法使其输出与您的输出完全相同。我花了2天时间,但也没有运气。无论如何,谢谢你的努力。
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)
            };