【问题标题】:For Each File in Folder, Include XML对于文件夹中的每个文件,包括 XML
【发布时间】:2013-10-17 20:14:43
【问题描述】:

我有一个像这样的冗长的 XML:

MainXML.xml:

<OpenTag>
    <SubTag>Value 1</SubTag>
    <SubTag>Value 2</SubTag>
    <SubTag>Value 3</SubTag>
    <SubTag>Value 4</SubTag>
</OpenTag>

除了SubTag是一个更复杂的重复结构,有很多数据。我不能以某种方式这样做吗?:

SubXML1.xml:

<SubTag>Value 1</SubTag>

SubXML2.xml:

<SubTag>Value 2</SubTag>

SubXML3.xml:

<SubTag>Value 3</SubTag>

SubXML4.xml:

<SubTag>Value 4</SubTag>

MainXML.xml:

<OpenTag>
    ... For Each XML File in the Sub-XML Folder, stick it here.
</OpenTag>

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

【问题讨论】:

    标签: c# xml vb.net xslt


    【解决方案1】:

    如果您对 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()));
    }
    

    【讨论】:

    • 哇。假设它看起来很有效,那是非常巧妙的。是的,我是一个大的 LINQ 用户。我确实希望有一个非代码示例,XSLT 中的东西或其他东西。所以我不会选择答案,直到希望沿着这条线出现一些东西。但绝对是对光滑的投票。
    • 我上次使用 XSLT 是很久以前,在 .Net 2.0 上。然后微软决定不支持 XSLT 2.0...但是this 可能对你有帮助。
    • 谢谢!我实际上不想用那个“引导”答案。我真的希望有这样的东西,但是在 For-Each 循环中从文件夹中获取文件名。我不认为这完全是可能的,但希望这样的事情是可能的。
    • 实际上,您可以在 XSLT 中添加 extension object 以获取文件列表。
    • 我相信这是我最接近答案的地方,而且确实非常接近。我知道到目前为止,不可能在 XML/XSLT 中做我想做的事情。扩展是个好主意,但 LINQ to XML 可能是我要走的路线。感谢您的意见。
    【解决方案2】:

    不确定这是否正是您所追求的,但它似乎工作正常。它依赖于 XSLT 2.0,希望你可以使用它。您还需要为 SubXML 文件准备一个文件夹:

    <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>
    

    【讨论】:

    • 该解决方案非常好。问题是,它依赖于我编辑主文件,并且至少放置与文件相同数量的 SubTag 标签。如果每次创建新的子文件都必须编辑主文件,我还不如添加一个新的文件名。
    猜你喜欢
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多