Xml 如何在linq中合并列中的数据
我有一个xml格式的源数据,比如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<
<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)
};