C# XML文档的松散合并

C# XML文档的松散合并,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有两个文档——一个是自定义XML文件格式,另一个是带有一系列自定义扩展名的RSS提要。当一个元素值匹配时,我想用RSS提要中的值填充XML文件中的字段 这适用于将手动运行几次的脱机进程-它不需要执行良好,也不需要所有的容错等。手动或干预是可以的 我的主XML文档如下所示: <videos> <video> <title>First Video</title> <code

我有两个文档——一个是自定义XML文件格式,另一个是带有一系列自定义扩展名的RSS提要。当一个元素值匹配时,我想用RSS提要中的值填充XML文件中的字段

这适用于将手动运行几次的脱机进程-它不需要执行良好,也不需要所有的容错等。手动或干预是可以的

我的主XML文档如下所示:

    <videos>
        <video>
            <title>First Video</title>
            <code>AAA123</code>
            <id>decaf-decaf-decaf-decaf</id>
            <description>lots of text here...</description>
        </video>
        <video>
            <title>Second Video with no code</title>
            <code></code>
            <id>badab-badab-badab-badab</id>
            <description>lots of text here...</description>
        </video>
    </videos>
<rss xmlns:ns="http://test.com" version="2.0">
  <channel>
    <item>
      <title>AAA123</title>
      <link>http://test.com/AAA123</link>
      <pubDate>Sun, 26 Jul 2009 23:59:59 -0800</pubDate>
      <ns:code>AAA123</ns:code>
      <ns:type>Awesome</ns:type>
      <ns:group>Wonderful</ns:group>
    </item>
  </channel>
</rss>
RSS提要是带有一些额外字段的标准RSS:

  <ns:code>AAA123</ns:code>
  <ns:type>Awesome</ns:type>
  <ns:group>Wonderful</ns:group>
我最喜欢使用c#、LINQ或某种Excel fu。我想如果有必要,我可以处理XSLT,只要它不涉及我自己编写太多XSLT

我看了这个问题,但它似乎对我想做的事情没有多大帮助:
听起来像是LINQ对XML的一项工作

var vidDoc = XDocument.Parse(vidXml);
var rssDoc = XDocument.Parse(rssXml);
var videos = vidDoc.XPathSelectElements("/videos/video");
var rssItems = rssDoc.XPathSelectElements("/rss/channel/item");
var matches = videos.Join(
    rssItems,
    video => video.Element(XName.Get("code")).Value,
    rssItem => rssItem.Element(XName.Get("code", "http://test.com")).Value,
    (video, item) => new {video, item});

foreach (var match in matches)
{
    var children = match.item.Elements()
        .Where(child => child.Name.NamespaceName == "http://test.com" &&
                        child.Name.LocalName != "code");

    foreach (var child in children)
    {
        //remove the namespace
        child.Name = XName.Get(child.Name.LocalName);
        match.video.Add(child);
    }
}

vidDoc.Save(Console.Out);
上述解决方案假设RSS文档的外观如下所示:

    <videos>
        <video>
            <title>First Video</title>
            <code>AAA123</code>
            <id>decaf-decaf-decaf-decaf</id>
            <description>lots of text here...</description>
        </video>
        <video>
            <title>Second Video with no code</title>
            <code></code>
            <id>badab-badab-badab-badab</id>
            <description>lots of text here...</description>
        </video>
    </videos>
<rss xmlns:ns="http://test.com" version="2.0">
  <channel>
    <item>
      <title>AAA123</title>
      <link>http://test.com/AAA123</link>
      <pubDate>Sun, 26 Jul 2009 23:59:59 -0800</pubDate>
      <ns:code>AAA123</ns:code>
      <ns:type>Awesome</ns:type>
      <ns:group>Wonderful</ns:group>
    </item>
  </channel>
</rss>

AAA123
http://test.com/AAA123
2009年7月26日星期日23:59:59-0800
AAA123
真棒
精彩的

将其添加到XSLT标识转换中(您还需要为
http://test.com
名称空间到转换的顶级元素):



如果您已经将RSS读入程序中的
XmlDocument
,则可以将其作为参数传递到XSLT中,而不是使用
document()
函数来读取它。

这看起来很棒!明天早上我会测试,然后做标记作为答案。谢谢,这个看起来不错。我将坚持使用c#方法,因为我对它更熟悉,而且(对我来说)调试起来也更容易。