LINQ to XML查询(基本)

时间:2009-12-08 10:42:43

标签: linq-to-xml

我有以下格式的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;

我对它不满意。还有其他方法吗?请帮助。

1 个答案:

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

希望这至少会给你一些新的想法