C# 对于文件夹中的每个文件,包括XML

C# 对于文件夹中的每个文件,包括XML,c#,xml,vb.net,xslt,C#,Xml,Vb.net,Xslt,我有一个很长的XML,如下所示: MainXML.xml: <OpenTag> <SubTag>Value 1</SubTag> <SubTag>Value 2</SubTag> <SubTag>Value 3</SubTag> <SubTag>Value 4</SubTag> </OpenTag> <OpenTag> ..

我有一个很长的XML,如下所示:

MainXML.xml:

<OpenTag>
    <SubTag>Value 1</SubTag>
    <SubTag>Value 2</SubTag>
    <SubTag>Value 3</SubTag>
    <SubTag>Value 4</SubTag>
</OpenTag>
<OpenTag>
    ... For Each XML File in the Sub-XML Folder, stick it here.
</OpenTag>
SubXML2.xml:

<SubTag>Value 2</SubTag>
值2
SubXML3.xml:

<SubTag>Value 3</SubTag>
值3
SubXML4.xml:

<SubTag>Value 4</SubTag>
值4
MainXML.xml:

<OpenTag>
    <SubTag>Value 1</SubTag>
    <SubTag>Value 2</SubTag>
    <SubTag>Value 3</SubTag>
    <SubTag>Value 4</SubTag>
</OpenTag>
<OpenTag>
    ... For Each XML File in the Sub-XML Folder, stick it here.
</OpenTag>

... 对于子XML文件夹中的每个XML文件,请将其粘贴在此处。

我意识到我可以用基本的文件和字符串函数来实现这一点,但我想知道XSL/XML是否有一种本机方式来实现这一点。

如果您对LINQ to XML没有问题,下面是一个工作代码:

public static XDocument AggregateMultipleXmlFilesIntoASingleOne(string parentFolderPath, string fileNamePrefix)
{
    return new XDocument(
        new XElement("OpenTag", 
            Directory.GetFiles(parentFolderPath)
                .Where(file => Path.GetFileName(file).StartsWith(fileNamePrefix))
                .Select(XDocument.Load)
                .Select(doc => new XElement(doc.Root))
                .ToArray()));
}

不确定这是否正是你想要的,但它似乎工作正常。它依赖于XSLT2.0,希望您可以使用它。您还需要为子XML文件准备一个文件夹:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>    

<xsl:template match="/">
    <xsl:for-each select="//SubTag">
        <xsl:result-document href="folder/SubXML{position()}.xml" method="xml">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:result-document>
    </xsl:for-each>
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>


Wowza。假设这是可行的,看起来是可行的,那就相当巧妙了。是的,我是LINQ的大用户。我确实希望有一个非代码示例,XSLT中的一些东西。所以我不会选择一个答案,直到有希望的东西沿着这条线出现。但肯定是对光滑性投了赞成票。上次我使用XSLT是在.NET2.0上的lo-o-ong。然后微软决定不支持XSLT2.0。。。但可能对你有帮助。谢谢!我其实不想用这个来“引导”答案。我真的很希望这样,但在for-Each循环中,可以从文件夹中获取文件名。我不认为这完全是可能的,但希望类似的事情是可能的。实际上,您可以在XSLT中添加一个,以获得文件列表。我相信这是我能得到的最接近答案,而且确实非常接近。我理解,到目前为止,不可能在XML/XSLT中实现我想要的本机功能。扩展是个好主意,但LINQ到XML可能是我要走的路线。谢谢你的意见。这个解决方案很好。问题是,它依赖于我编辑主文件,并至少放置与文件数量相同的子标签。如果每次创建新的子文件时都必须编辑主文件,那么最好只添加一个新文件名。