XML 的 C# LINQ 左外连接无法正常工作
C# LINQ Left Outer Join for XML doesn't work properly
我正在尝试为两个 XML 执行 Left Outer Join 并获取另一个 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));
这就是我使用该代码加入 XMLs 上面的两个:
<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>
"..but LINQ's query 'into' seems to be extracting only values but not full elements with all the original tags and attributes"
您实际上得到了预期的 XElement
s,但随后它被显式转换为 string
,这导致仅保留字符串值,此处:
select new XElement("child", first, tmpL == null ? String.Empty : (string)tmpL);
当你不想让任何东西成为新创建的 child
元素的子元素时,删除转换并简单地传递 null
而不是 String.Empty
:
select new XElement("child", first, tmpL == null ? null : tmpL);
或者简单地传递 tmpL
不管它是否是 null
,这会产生一个等效但更清晰的语句:
select new XElement("child", first, tmpL);
我正在尝试为两个 XML 执行 Left Outer Join 并获取另一个 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));
这就是我使用该代码加入 XMLs 上面的两个:
<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>
"..but LINQ's query 'into' seems to be extracting only values but not full elements with all the original tags and attributes"
您实际上得到了预期的 XElement
s,但随后它被显式转换为 string
,这导致仅保留字符串值,此处:
select new XElement("child", first, tmpL == null ? String.Empty : (string)tmpL);
当你不想让任何东西成为新创建的 child
元素的子元素时,删除转换并简单地传递 null
而不是 String.Empty
:
select new XElement("child", first, tmpL == null ? null : tmpL);
或者简单地传递 tmpL
不管它是否是 null
,这会产生一个等效但更清晰的语句:
select new XElement("child", first, tmpL);