C#LINQ左外连接XML无法正常工作

时间:2015-08-08 12:17:31

标签: c# xml linq outer-join

我正在尝试为两个XML执行左外连接并获取另一个XML(不是集合!)作为输出,但LINQ的查询'into'似乎只提取值但是不是包含所有原始标签和属性的完整元素。

我的 xml1 如下所示:

<tag>
  <abc id="zxy">tiger</abc>
  <abc id="zzz">rabbit</abc>
</tag>

我的 xml2

<tag>
  <aaa attr1="1" attr2="zzz">value1</aaa>
  <aaa attr1="2" attr2="zxc">value2</aaa>
</tag>

我在C#中的代码:

var que= from first in xml1
         join second in xml2
         on (string)first.Attribute(attr1) equals (string)second.Attribute(attr2) into temp
         from tmpL in temp.DefaultIfEmpty()
         orderby (string)first.Attribute(attr1)//, (string)tmpL.Attribute(attr2) -- this one isn't working because it's not an element
         select new XElement("child", first, tmpL == null ? String.Empty : (string)tmpL);

var final= new XDocument(new XElement("parent", que));

这是我使用该代码加入两个以上XML的原因:

<parent>
  <child>
    <abc id="zxy">tiger</abc>value1</child>
  <child>
    <abc id="zzz">rabbit</abc>value2</child>
</parent>

正如你所看到的那样,一个无效的XML,其中value1和value2坚持兄弟元素,而它们应该包含在他们自己的原始标签中(带有原始属性):<aaa attr1="1" attr2="zzz">value1</aaa><aaa attr1="2" attr2="zxc">value2</aaa>相应地。

因此我不能在它们上使用.Attribute()和其他东西。 此外,我不能只在新创建的元素中插入这些值,因为我需要xml2中原始元素的属性。

您能帮助我获取以下XML吗?

<parent>
  <child>
    <abc id="zxy">tiger</abc>
    <aaa attr1="1" attr2="zzz">value1</aaa>
  </child>
  <child>
    <abc id="zzz">rabbit</abc>
    <aaa attr1="2" attr2="zxc">value2</aaa>
  </child>
</parent>

1 个答案:

答案 0 :(得分:1)

  

“..但LINQ的查询'into'似乎只提取了值,但没有提取所有原始标记和属性的完整元素”

您实际上按预期获得了XElement,但随后将其显式转换为string,这导致仅保留字符串值,此处:

select new XElement("child", first, tmpL == null ? String.Empty : (string)tmpL);

如果您不想成为新创建的null元素的子元素,请移除转换并简单地传递String.Empty而不是child

select new XElement("child", first, tmpL == null ? null : tmpL);

或简单地传递tmpL,无论它是null,还是等同于更清晰的声明:

select new XElement("child", first, tmpL);