使用循环在 XDocument 中动态创建 XElements

Dynamically creating XElements inside XDocument using a loop

我需要能够使用循环在 XDocument 中动态创建 'n' 个 XElement,具体取决于在目录中找到的文件数量。

我的 WIP 基本项目代码可能有点长,无法粘贴到这里,所以我已将其添加到 pastie.org - here

您会看到在第 73-91 行之间我有一个 foreach 循环,它搜索目录及其子目录并找到其中包含的所有文件的路径。 我知道这是我自己使用的作品:

int x = filePaths.Length;

并且 x 的输出与给定目录中的文件数匹配。

代码的主要部分也可以工作,并根据需要创建一个 HTML 文件,但我还需要它在我放置的第 215 行之间动态创建 'n' XElements:

/// **** NEED TO INSERT LOOP HERE TO DYNAMICALLY CREATE NUMBER OF ELEMENTS DEPENDING ON NUMBER OF FILES IN DIRECTORY ****

就在 <TR> 标签开始之前和第 280 行,就在 <TR> 标签结束之后,所以在指定目录中找到的每个文件都会有自己的 <TABLE>行。

我已经记不清我尝试通过在整个代码中移动循环来实现这一点的方法的数量了,但是我一直在遇到大量错误的砖墙。

最初我认为将循环放在第 215 行的代码中会很简单,但这样做会导致许多错误,例如 missing:

等...

现在我完全卡住了。

我正在尝试在 C# 中模拟我前段时间制作的批处理文件,该文件使用 WMIC 运行良好但功能有限,我希望添加更多功能,这就是 C# 的用武之地。

批处理文件使用循环,就像我在这里尝试的那样,完全没有任何问题。

这是来自 WMIC 批处理文件的循环:

(FOR /f "delims=" %%a IN ('dir /b /a-d /s /n "C:\UsersCM69\Pics & Vids\Archives\Family02"') DO (
FOR /f "tokens=1-3*" %%x IN ('dir /a-d /tc "%%~a"^|findstr "^[0-9]"') DO (
  for /f %%c in ("%%~ta") do (
ECHO ^<TR^>^<td style="border-width: 1px;padding: 10px;border-style: inset;border-color: gray;background-color: white;" align="center" valign="middle"^>^<a href="%%a" target="_new"^>^<img src="%%a" width="100px" border="0"^>^</a^>^</TD^>^<td style="border-width: 1px;padding: 10px;border-style: inset;border-color: gray;background-color: white;" align="left" valign="middle"^>^<B^>%%~nxa^</B^>^</TD^>^<td style="border-width: 1px;padding: 10px;border-style: inset;border-color: gray;background-color: white;" align="center" valign="middle"^>^<B^>%%~c^</B^>^</TD^>^<td style="border-width: 1px;padding: 10px;border-style: inset;border-color: gray;background-color: white;" align="center" valign="middle"^>^<B^>%%x^</B^>^</TD^>^</TR^> >> 2002.html))))

我发现 Create XML with XDocument with a variable number of XElements using for loop 会四处搜索 & 最初是充满希望的,虽然我确实让它根据文件数量动态创建 'n' 数量的 XElements,但变量 DateTaken只显示目录中最后一个文件的值,所以我有一个 <TABLE> 有 68 行 <TR>,在我使用的测试目录的情况下,它们都包含从循环找到的最终文件。

如有任何帮助,我们将不胜感激。

问候..,

不要使用循环,使用 LINQ from .. select .. 表达式,例如

from file in filePaths
select new XElement("tr", 
  new XElement("td",
    new XElement("a", new XAttribute("href", file), new XAttribute("target", "_new"), new XElement("img", new XAttribute("src", file), new XAttribute("width", "100"))),
    new XElement("td", file),
    new XElement("td", GetDate(file))
  ))

要提取日期,请编写一个封装代码的方法,例如

string GetDate(string path) {

try
                                        {

                                        Bitmap MyPhoto = new Bitmap(file);
                                        const int IDDateTimeOriginal = 36867;
                                        PropertyItem TakenDate = MyPhoto.GetPropertyItem(IDDateTimeOriginal);
                                        Encoding ascii = Encoding.ASCII;
                                        return ascii.GetString(TakenDate.Value, 0, TakenDate.Len - 1);
                                        }


                                        catch //(ArgumentException) if the property doesn't exists
                                        {
                                          return "MISSING ENTRY";
                                        }
}

如果您使用的是 XElements,它们被设计为可与 Linq 一起使用,请尝试这样的操作:

var filePaths = GetFiles(@"C:\SomeDir");
var xml = new XElement("tr", 
    filePaths.Select(fp => new XElement("td", fp.FullName)));