C#:获取包含所有父标记的XML节点内容

时间:2018-04-16 22:19:17

标签: c# xml linq

有一个XML文件:

<favorites>
    <movies>
        <movie title="The Godfather" year="1974" />
        <movie title="The Terminator" year="1984" />
        <movie title="Dark Knight" year="2008" />
    </movies>

    <books>
        <book title = "1984" author="George Orwell" />
        <book title = "Robinson Crusoe"" author="Daniel Defoe"/>
        <book title = "Frankenstein" author="Mary Shelly" />
    </books>

    <music>
        <artist title = "Beatles" genre="rock" />
        <artist title = "Queen" genre="rock" />
        <artist title = "Metallica" rock="heavy metal" />
    </music>
</favorites>

我需要使用所有父级&amp ;;过滤特定节点(音乐)节点。 结果应该是:

<favorites>
  <music>
    <artist title="Beatles" genre="rock" />
    <artist title="Queen" genre="rock" />
    <artist title="Metallica" rock="heavy metal" />
  </music>
</favorites>

我找到了使用System.XML&amp; amp;过滤XML的解决方案。 LINQ:

 XDocument xdoc = XDocument.Parse(xmlString);    
 xdoc.Descendants()
     .Where(x => x.Name != "favorites" & x.Name != "music" & x.Name != "artist")
     .Remove();    
 Console.WriteLine(xdoc.ToString());

工作样本在这里:https://dotnetfiddle.net/NnA4h7#

问题是我必须指定所有父母和我的查询中的子节点。

有没有办法通过仅指定想要的节点(电影,书籍,音乐)来获得相同的结果?

2 个答案:

答案 0 :(得分:2)

这是另一种更简单的方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            XElement favorites = doc.Descendants("favorites").FirstOrDefault();

            favorites.ReplaceNodes(favorites.Element("music")));
        }
    }
}

答案 1 :(得分:1)

基本上你需要删除除音乐父母,音乐本身及其后代之外的所有节点。

connect-SPOService -Url $adminUrl -Credential $pscreds

$fileToRead= Import-CSV -Path C:\...\sitemasterpages.csv

foreach($site in $fileToRead)
{
    $web = Get-Pnpweb($site.SiteUrl); 
    $masterPage = $web.GetFile($web.MasterUrl);
    $masterPage.Name 
    $web.Title 
}

它返回:

var music = xdoc.Descendants().Where(x => x.Name == "music");
xdoc.Descendants().Where(x =>
    !music.AncestorsAndSelf().Contains(x)
    && !music.Descendants().Contains(x)
).Remove();
Console.WriteLine(xdoc.ToString());

更新:支持收藏夹和音乐之间的多个嵌套级别。针对大文件运行进行了优化:

<favorites>
  <music>
    <artist title="Beatles" genre="rock" />
    <artist title="Queen" genre="rock" />
    <artist title="Metallica" rock="heavy metal" />
  </music>
</favorites>