我已经生成了一个XmlDocument,并使用文件路径的递归遍历来填充它。该文件或多或少看起来像这样:
<?xml version="1.0" encoding="utf-16"?>
<Tree>
<Directory name="Root" path="C:\Root">
<Directory name="1" path="C:\Root\1">
<Directory name="3" path="C:\Root\1\3">
<File name="5.png" size="198525440" path="C:\Root\1\3\5.png" />
<File name="6.png" size="736621" path="C:\Root\1\3\6.png" />
</Directory>
<File name="2.png" size="761944" path="C:\Root\1\2.png" />
<File name="3.png" size="2663" path="C:\Root\1\3.png" />
</Directory>
<Directory name="2" path="C:\Root\2">
<File name="4.png" size="324187" path="C:\Root\2\4.png" />
</Directory>
<File name="1.png" size="2663" path="C:\Root\1.png" />
</Directory>
</Tree>
对于目录结构:
C:
C:\Root
C:\1
C:\1\3
C:\1\3\5.png
C:\1\3\6.png
C:\1\2.png
C:\1\3.png
C:\2
C:\2\4.png
C:\1.png
鉴于上述树,目标是以人类可读的形式将树写入控制台,如下所示:
Root/
+-- 1/
| +-- 3/
| | +-- 5.png
| | +-- 6.png
| +-- 2.png
| +-- 3.png
| +-- 2/
| | +-- 4.png
+-- 1.png
现在,我可以很容易地编写一个递归结构,输出所需文本的函数,但我认为XSLT可能会以稍微简单的方式将XmlDocument转换为上面显示的形式。我要问的唯一问题是......怎么样?对于XSLT(意思是一个总的菜鸟),我有点像菜鸟。我认为使用变换将是一种更灵活的方法来硬编码遍历和输出函数。
除此之外,能够按名称或文件大小对XML树进行排序,同时保留文件树结构(对每个节点的子节点进行排序)会很好。可以用XSLT完成,还是应该编写自己的IComparer来执行此操作?
感谢您提供的任何帮助。
答案 0 :(得分:1)
使用XSLT可以轻松地对文档进行排序,这是一个XSLT 1.0样式表,它按Directory
属性对任何name
子元素进行排序,并按属性名称对任何File
子元素进行排序使用参数设置:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:param name="sort-key" select="'size'"/>
<xsl:param name="sort-type" select="'number'"/>
<xsl:param name="sort-order" select="'ascending'"/>
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Directory">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="Directory">
<xsl:sort select="@name"
data-type="text"
order="{$sort-order}"/>
</xsl:apply-templates>
<xsl:apply-templates select="File">
<xsl:sort select="@*[local-name() = $sort-key]"
data-type="{$sort-type}"
order="{$sort-order}"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>