2009-12-08 109 views
0

我有以下格式的XML的LINQ to 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>" 

忽略 “”

现在我想这样

 "<root>" 
    "<title>text</title>" 
    "<text attrib1="4">some text</text>" 
    "<title>text</title>" 
    "<text attrib1="4">some text</text>" 
    "</root>" 

生成的XML能这样在一个查询中实现? 我尝试用两个查询

 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

你能告诉你正在尝试使用XML,而不是文字呢? – UpTheCreek 2009-12-08 10:44:07

+0

嘿对不起你们即时通讯无法粘贴XML这里的所有标签兵删除..:'( – Amit 2009-12-08 10:46:40

+0

放在一个代码块,就像你用C#做 – UpTheCreek 2009-12-08 10:47:13

回答

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}); 

希望这一点,至少,给你一对夫妇的新思路

+0

感谢卡迈勒... :) – Amit 2009-12-08 12:30:58