找到时合并两个XML文档并覆盖XML字段

时间:2011-06-27 14:11:19

标签: c# xml xslt

我很难将两个XML文档合并在一起,我想要合并的新第二个xml在找到时覆盖现有字段,并在不存在时创建;

<filemeta filetype="Video">
    <heading>News Headlines</heading>
    <shortblurb>The latest news roundup</shortblurb>
    <description />
    <files>
        <file type="coverimage">headlines.png</file>
    </files>
    <Comments />
    <AlbumTitle />
    <TrackNumber />
    <ArtistName />
    <Year />
    <Genre />
    <TrackTitle />
    <duration>00:02:22</duration>
    <totalbitrate>1168 kb/s</totalbitrate>
    <videocodec>h264</videocodec>
    <pixelformat>yuv420p</pixelformat>
    <resolution>640x360</resolution>
    <audiocodec>aac</audiocodec>
    <audiofrequency>44100 Hz</audiofrequency>
    <channelmulplicity>stereo</channelmulplicity>
    <audioformat>s16</audioformat>
    <audiobitrate>111 kb/s</audiobitrate>
</filemeta>

并与此合并;

<filemeta type="Video">
    <duration>00:00:45</duration>
    <totalbitrate>548 kb/s</totalbitrate>
    <videocodec>h264</videocodec>
    <pixelformat>yuv420p</pixelformat>
    <resolution>720x576</resolution>
    <audiocodec>aac</audiocodec>
    <audiofrequency>48000 Hz</audiofrequency>
    <channelmulplicity>stereo</channelmulplicity>
    <audioformat>s16</audioformat>
    <audiobitrate>65 kb/s</audiobitrate>
</filemeta>

我尝试过使用各种XSLT scriptsthis但是他们似乎只是将第二个脚本附加到第一个脚本的末尾,从而使我的XML无效。理想情况下,我喜欢这个C#

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

这是一个可能的(强大的)XSLT 1.0解决方案,只是为了给出一个想法。

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml" indent="yes"/>

    <xsl:variable name="data2" select="document('test_i2.xml')/filemeta"/>

    <xsl:template match="filemeta">
        <xsl:copy>
        <xsl:for-each select="*">
            <xsl:variable name="element1" select="name(.)"/>
            <xsl:choose>
                <xsl:when test="count($data2/*[name()=$element1])!=0">
                    <xsl:copy-of select="$data2/*[name()=$element1]"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:copy>     
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

看看这个question,我认为它会解决你的问题。