我有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实现此目的?
提前致谢。
答案 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)
};