我有以下格式的xml
"<root>"
"<page>"
"<title>text</title>"
"<text attrib1="1">some text</text>"
"<text attrib1="2">some text</text>"
"<text attrib1="3">some text</text>"
"<text attrib1="4">some text</text>"
"</page>"
"<page>"
"<title>text</title>"
"<text attrib1="1">some text</text>"
"<text attrib1="2">some text</text>"
"<text attrib1="3">some text</text>"
"<text attrib1="4">some text</text>"
"</page>"
"</root>"
忽略“”
现在我想要像这样的结果xml
"<root>"
"<title>text</title>"
"<text attrib1="4">some text</text>"
"<title>text</title>"
"<text attrib1="4">some text</text>"
"</root>"
可以在一个查询中实现吗? 我使用两个查询
尝试了以下操作 var titleElms =
from t in allElements
select
new
{
Title = t.Element("title")
};
var textElms =
from t in allText
where (string)t.Attribute("attrib1").Value == "4"
select
t;
我对它不满意。还有其他方法吗?请帮助。
答案 0 :(得分:2)
我不认为这会给你你想要的东西,因为查询会产生一个Ienumerable对象。意味着您希望单个对象具有大量标题和文本字段。这将返回一个对象,其标题和文本是Ienumerable对象中的对象。
因此在您的示例中,您将拥有一个具有两个对象的对象,每个匿名对象现在都包含标题和文本。一旦你有了这个,你可以按照你想要的方式构建xml。它与您的解决方案并没有太大的不同,但根据要求,它将为您提供一个linq查询。或者至少给你一个构思的想法。
XElement Results = XElement.Load("c:\\test.xml"); //load you xml
XNamespace NameSpace = Results.Name.Namespace;
var xe = (from page in Results.Elements(NameSpace + "page")
let title = page.Elements(NameSpace+"title")
let text = page.Elements(NameSpace+"text").Where(a=>a.Attribute("attrib1").Value.Equals("4"))
where text.Count() > 0
//the where is simply to remove any unncessary data
//if there was ever a page that didn't have attrib1 = 4
select new {title, text});
希望这至少会给你一些新的想法